在交换机案例中枚举引用

Sur*_*ran 7 java enums switch-statement

enum Color {RED, GREEN, BLUE};
class SwitchEnum
{
  public static void main(String[] args)
  {
    Color c = Color.GREEN;
    switch(c)
    {
      case RED:
        System.out.println("red");
        break;
      case GREEN:
        System.out.println("green");
        break;
      case BLUE:
        System.out.println("blue");
        break;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码编译得很好并给出了预期的输出.

我的问题是为什么在创建Color引用'c'时我们需要通过枚举的名称(即Color.GREEN)引用它,但在case块中只有enum值足够.不应该

case Color.RED:
Run Code Online (Sandbox Code Playgroud)

等等???

Mar*_*ers 5

不,它不应该.Java编译器很聪明,知道你正在打开a Color,所以语言允许这个快捷方式(正如Paul所说,需要它).实际上,switch语句的整个编译取决于编译器知道你要切换的内容,因为它根据你指定的枚举值的索引将交换机转换为跳转表.直到最近你才能开启非数字化的东西,如a String.

语言规范的相关部分在JLS第14.11章中:

...
SwitchLabel:
   case ConstantExpression :
   case EnumConstantName :
   default :

EnumConstantName:
   Identifier
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找洞察为什么语言的设计方式,那就很难客观地回答.语言设计很细微,您必须考虑在添加枚举支持之前多年和几年编写赋值语法.