java - switch case 中的枚举引用

标签 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;
    }
  }
}

上面的代码可以很好地编译并给出预期的输出。

我的问题是为什么在创建颜色引用“c”时我们需要通过枚举名称(即 Color.GREEN)引用它,但在 case block 中只有枚举值就足够了。不应该是吗

case Color.RED:

等???

最佳答案

不,不应该。 Java 编译器足够聪明,知道您正在打开 Color,因此该语言允许使用此快捷方式(正如 Paul 指出的那样,需要它)。事实上,switch 语句的整个编译过程取决于编译器是否知道您正在打开什么,因为它会根据您指定的枚举值的索引将 switch 转换为跳转表。直到最近,您才能够打开非数字的东西,例如 String

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

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

EnumConstantName:
   Identifier

如果您要深入了解为什么语言是这样设计的,那将很难客观地回答。语言设计很微妙,您必须考虑到赋值语法是在添加枚举支持之前多年编写的。

关于java - switch case 中的枚举引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10545322/

相关文章:

java - 按位置将 JSONArray 映射到对象

python enum.Enum _value_ 与值

java - 我使用 Java 制作的菜单中的无限循环

c# - C# 中的枚举助手未给出预期结果

javascript - 即使有中断,Switch 语句也会直接转到默认值

java - 在 switch case 语句中使用方法

java - 使用数组对有界集进行添加/删除操作的最坏情况的时间复杂度?

java - 当应用程序从Play商店强制更新时,如何保持Android应用程序始终处于登录状态?

java - 用 ASCII 替换 Unicode

java - 枚举<?扩展界面>