这个功能会被放到后面的Java版本中吗?

有人能解释一下为什么我不能这样做,比如,Java的switch语句工作的技术方式吗?


当前回答

从1.7开始直接使用String的例子如下:

public static void main(String[] args) {

    switch (args[0]) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
            System.out.println("boring");
            break;
        case "Thursday":
            System.out.println("getting better");
        case "Friday":
        case "Saturday":
        case "Sunday":
            System.out.println("much better");
            break;
    }

}

其他回答

多年来,我们一直在为此使用(n个开源)预处理器。

//#switch(target)
case "foo": code;
//#end

预处理文件被命名为Foo.jpp,并使用ant脚本处理为Foo.java。

优点是它被处理成运行在1.0上的Java(尽管通常我们只支持1.4版本)。而且,与使用枚举或其他变通方法相比,这样做(大量字符串开关)要容易得多——代码更容易阅读、维护和理解。IIRC(在这一点上不能提供统计数据或技术推理)也比自然的Java等价物更快。

缺点是你没有编辑Java,所以它有更多的工作流(编辑、处理、编译/测试),加上IDE将链接回Java,这有点复杂(切换变成一系列if/else逻辑步骤),并且切换case顺序没有维护。

对于1.7以上版本,我不推荐使用它,但如果您想编写针对早期jvm的Java程序,它很有用(因为Joe public很少安装最新版本)。

您可以从SVN获取或在线浏览代码。您将需要EBuild按原样构建它。

从1.7开始直接使用String的例子如下:

public static void main(String[] args) {

    switch (args[0]) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
            System.out.println("boring");
            break;
        case "Thursday":
            System.out.println("getting better");
        case "Friday":
        case "Saturday":
        case "Sunday":
            System.out.println("much better");
            break;
    }

}

除了以上好的论点,我还要补充一点,今天很多人认为switch是Java过去过程化的过时残余(回到C时代)。

我不完全同意这个观点,我认为switch在某些情况下有它的用处,至少因为它的速度,无论如何,它比我在一些代码中看到的一系列级联数字要好…

但实际上,有必要考虑一下需要开关的情况,看看它是否不能被更面向对象的东西所取代。例如Java 1.5+中的枚举,也许是哈希表或其他集合(有时我后悔我们没有(匿名)函数作为第一类公民,就像Lua -没有开关-或JavaScript),甚至是多态性。

James Curran简洁地说:“基于整数的开关可以优化为非常高效的代码。基于其他数据类型的开关只能编译为一系列if()语句。因此,C和c++只允许在整数类型上切换,因为这对其他类型是没有意义的。”

My opinion, and it's only that, is that as soon as you start switching on non-primitives you need to start thinking about "equals" versus "==". Firstly comparing two strings can be a fairly lengthy procedure, adding to the performance problems that are mentioned above. Secondly if there is switching on strings there will be demand for switching on strings ignoring case, switching on strings considering/ignoring locale,switching on strings based on regex.... I would approve of a decision that saved a lot of time for the language developers at the cost of a small amount of time for programmers.

其他回答说,这是在Java 7中添加的,并为早期版本提供了变通办法。这个答案试图回答“为什么”

Java是对c++过于复杂的一种反应。它被设计成一种简单干净的语言。

String在语言中有一些特殊情况的处理,但在我看来很明显,设计师试图将特殊的大小写和语法糖分保持在最低限度。

由于字符串不是简单的基元类型,因此打开字符串实际上是相当复杂的。在设计Java的时候,这并不是一个常见的特性,也不太适合极简设计。特别是当他们决定不为字符串使用特殊case ==时,case在==不工作的情况下工作会有点奇怪。

在1.0到1.4之间,语言本身基本保持不变。对Java的大多数增强都是在库方面。

这一切在Java 5中都有所改变,该语言得到了实质性的扩展。在版本7和8中进行了进一步的扩展。我认为这种态度的转变是由c#的兴起所推动的