为什么我得到一个枚举常量引用无法在案例标签中被限定?
为什么下面的代码无法编译,而更改case语句
case ENUM1: doSomeStuff();
作品?
public enum EnumType { ENUM1, ENUM2, ENUM3; void doSomeStuff() { switch(this) { case EnumType.ENUM1: doSomeStuff(); } } }
这是为了避免与不同枚举types进行比较的能力。 将其限制为一种types,即 switch
语句中的枚举值的types是有意义的。
更新 :它实际上保持二进制兼容性。 以下是JLS 第13.4.9章中的一个例子 :
要求内联常量的一个原因是
switch
语句在每种case
都需要常量,并且没有两个这样的常量值可能是相同的。 编译器在编译时检查switch
语句中重复的常量值;class
文件格式不做案例值的符号链接。
换句话说,由于EnumType.ENUM1
中的类标识符,它不能被表示为编译时常量expression式,而switch
语句则需要它。
这不是真的回答你的问题,但如果你有代码取决于枚举值,你也可以在你的枚举中创build一个抽象的方法,获取每个值的重载:
public enum EnumType { ENUM1 { @Override public void doSomeStuff() { // do something } }, ENUM2 { @Override public void doSomeStuff() { // do something else } }; public abstract void doSomeStuff(); }
既然你打开了一个EnumType
types的对象,并且唯一可能的值是枚举常量,那么就不需要再在这个开关内限定这些常量了。 毕竟,在case OtherEnumType.ENUM1:
,无论如何都是非法的。