(注意:已编辑的问题;先前的意图并不明确)
考虑以下代码:
public final class Foo
{
private enum X
{
VALUE1, VALUE2
}
public static void main(final String... args)
{
final X x = X.VALUE1;
switch (x) {
case VALUE1:
System.out.println(1);
break;
case VALUE2:
System.out.println(2);
}
}
}
此代码工作正常。
但是,如果我更换:
case VALUE1: // or VALUE2
使用:
case X.VALUE1: // or X.VALUE2
然后编译器抱怨:
java:/path/to/Foo.java:whatever:枚举开关案例标签必须是枚举常量的非限定名称
SO suggests an answer以及来自JLS的引用:
(要求内联常量的一个原因是switch语句在每种情况下都需要常量,并且没有两个这样的常量值可能是相同的。编译器在编译时检查switch语句中的重复常量值;类文件格式不与案例值进行符号链接。)
但这并不能让我满意。就我而言,VALUE1
和X.VALUE1
完全相同。引用的文字根本不解释它。
在JLS中定义enum
语句中的switch
值是否必须以这种方式编写?
答案 0 :(得分:10)
SwitchLabel
需要EnumConstantName
,其定义为枚举常量标识符which is unqualified:
EnumConstant:
注释 opt 标识符参数 opt ClassBody opt