在交换机案例中枚举引用

时间:2012-05-11 04:08:40

标签: 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 Color.RED:

等???

3 个答案:

答案 0 :(得分:5)

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

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

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

EnumConstantName:
   Identifier

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

答案 1 :(得分:2)

这是一种语言惯例。许多不同的语言都有枚举,并非所有语言都能让你这样做。对于Java,由于名称空间,您可以执行Color.RED或其他任何操作。通过这样做,您可以使用具有相同变量名称的多个枚举,并且它们不会发生冲突。

switch语句不要求你做Color.RED(并允许你简单地说明RED)的原因是switch语句知道它是Color类型的枚举,并查找该命名空间。 / p>

答案 2 :(得分:1)

在第

Color c = Color.GREEN;

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

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

而不仅仅是

ArrayList<String> x = new ArrayList();

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