为什么枚举值不能在switch语句中完全限定?

(注:编辑问题;先前意图不明确)

考虑以下代码:

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 建议从JLS的引用中得到答案 :

(需要内联常量的一个原因是switch语句在每种情况下都需要常量,并且没有两个这样的常量值可能是相同的。编译器在编译时检查switch语句中的重复常量值;类文件格式不做案例值的象征性联系。)

但这并不能让我满意。 就我而言, VALUE1X.VALUE1完全相同。 引用的文字对我来说根本没有解释。

在JLS中定义了switch语句中的enum值是否必须以这种方式写入?

SwitchLabel需要一个EnumConstantName ,它被定义为枚举常量标识符, 它是不合格的 :

EnumConstant:
注释opt Identifier Arguments opt ClassBody opt