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:
等???
答案 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
的类型推断出来的。