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

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


当前回答

下面是一个基于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 6的另一种方式:

String runFct = 
        queryType.equals("eq") ? "method1":
        queryType.equals("L_L")? "method2":
        queryType.equals("L_R")? "method3":
        queryType.equals("L_LR")? "method4":
            "method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);

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

多年来,我们一直在为此使用(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按原样构建它。

如果代码中有一个地方可以打开String,那么最好将String重构为可能值的枚举,这样就可以打开String。当然,可以将string的潜在值限制为枚举中的值,这可能是需要的,也可能不是需要的。

当然,你的枚举可以有一个'other'条目,和一个fromString(String)方法,然后你可以有

ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
   case MILK: lap(); break;
   case WATER: sip(); break;
   case BEER: quaff(); break;
   case OTHER: 
   default: dance(); break;
}