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

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


当前回答

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

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

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

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

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

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

其他回答

在Java 11+中,变量也是可行的。唯一的条件是它必须是常数。

例如:

final String LEFT = "left";
final String RIGHT = "right";
final String UP = "up";
final String DOWN = "down";

String var = ...;

switch (var) {
    case LEFT:
    case RIGHT:
    case DOWN:
    default:
        return 0;
}

PS.我还没有在早期的jdk中尝试过这一点。所以请更新答案,如果它也支持。

JDK-13中的JEP 354: Switch Expressions(预览)和JDK-14中的JEP 361: Switch Expressions(标准)将扩展Switch语句,使其可以用作表达式。

现在你可以:

直接从开关表达式中分配变量, 使用新形式的开关标签(case L ->): “case L ->”开关标签右侧的代码被限制为表达式、块或(为方便起见)throw语句。 每个大小写使用多个常量,用逗号分隔, 而且也没有更多的价值突破: 为了从switch表达式中产生一个值,用yield语句代替break with value语句。

所以答案(1,2)的演示可能是这样的:

  public static void main(String[] args) {
    switch (args[0]) {
      case "Monday", "Tuesday", "Wednesday" ->  System.out.println("boring");
      case "Thursday" -> System.out.println("getting better");
      case "Friday", "Saturday", "Sunday" -> System.out.println("much better");
    }

从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),甚至是多态性。

基于整数的开关可以优化为非常高效的代码。基于其他数据类型的开关只能编译为一系列if()语句。

因此,C和c++只允许对整型进行切换,因为它对其他类型没有意义。

c#的设计者认为风格很重要,即使它没有什么优势。

Java的设计者显然和C的设计者思想相似。