【问题标题】:enum referencing in switch case开关盒中的枚举引用
【发布时间】:2012-05-11 04:08:39
【问题描述】:
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 Color.RED:

等等???

【问题讨论】:

    标签: java enums switch-statement


    【解决方案1】:

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

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

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

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

    【讨论】:

    • +1 事实上你可以使用快捷方式。例如,请参阅this interesting post
    • @Paul:枚举 switch case 标签必须是枚举常量的unqualified名称。 thnx...明白了...
    【解决方案2】:

    这是一种语言约定。许多不同的语言都有枚举,并不是所有的语言都让你这样做。在 Java 的情况下,由于命名空间,您可以使用 Color.RED 或其他方式。通过这样做,您可以拥有多个具有相同变量名的枚举,并且它们不会发生冲突。

    switch 语句不需要您执行 Color.RED(并允许您简单地声明 RED)的原因是 switch 语句知道它是 Color 类型的枚举,并在该命名空间中查找。

    【讨论】:

      【解决方案3】:

      在一行

      Color c = Color.GREEN;
      

      Color. 是必需的,因为 Java 编译器不会从声明 (Color c) 中推断分配的表达式 (Color.GREEN) 的类型。出于同样的原因,你必须写:

      ArrayList<String> x = new ArrayList<String>();
      

      而不仅仅是

      ArrayList<String> x = new ArrayList();
      

      (这实际上在 Java 7 中已部分修复,但这是另一回事。)在 switch(...) 语句中,case 的类型是从 switch 的类型推断出来的。

      【讨论】:

        猜你喜欢
        • 2022-12-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        相关资源
        最近更新 更多