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

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


当前回答

如果您没有使用JDK7或更高版本,可以使用hashCode()来模拟它。因为String.hashCode()通常为不同的字符串返回不同的值,并且总是为相同的字符串返回相同的值,所以它是相当可靠的(不同的字符串可以产生与评论中提到的@Lii相同的哈希代码,例如“FB”和“Ea”)。

所以,代码看起来是这样的:

String s = "<Your String>";

switch(s.hashCode()) {
case "Hello".hashCode(): break;
case "Goodbye".hashCode(): break;
}

这样,你在技术上开启了一个整型。

或者,你可以使用下面的代码:

public final class Switch<T> {
    private final HashMap<T, Runnable> cases = new HashMap<T, Runnable>(0);

    public void addCase(T object, Runnable action) {
        this.cases.put(object, action);
    }

    public void SWITCH(T object) {
        for (T t : this.cases.keySet()) {
            if (object.equals(t)) { // This means that the class works with any object!
                this.cases.get(t).run();
                break;
            }
        }
    }
}

其他回答

下面是一个基于JeeBee的帖子的完整示例,使用java枚举而不是使用自定义方法。

注意,在Java SE 7及更高版本中,您可以在switch语句的表达式中使用String对象。

public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

      String current = args[0];
      Days currentDay = Days.valueOf(current.toUpperCase());

      switch (currentDay) {
          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;

      }
  }

  public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }
}

其他回答说,这是在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中尝试过这一点。所以请更新答案,如果它也支持。

从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;
    }

}

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

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

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

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