为什么在将case语句更改为时,以下代码无法编译
case ENUM1: doSomeStuff();
Run Code Online (Sandbox Code Playgroud)
作品?
public enum EnumType
{
ENUM1, ENUM2, ENUM3;
void doSomeStuff()
{
switch(this)
{
case EnumType.ENUM1: doSomeStuff();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 33
这是为了避免与不同的枚举类型进行比较的能力.将它限制为一种类型是有意义的,即switch语句中枚举值的类型.
更新:它实际上是为了保持二进制兼容性.以下是JLS 第13.4.9节中的一个引用:
要求内联常量的一个原因是
switch语句需要每个常量case,并且没有两个这样的常量值可能是相同的.编译器switch在编译时检查语句中的重复常量值; 该class文件格式没有做的情况下价值观的象征性的联系.
换句话说,由于类标识符在中EnumType.ENUM1,它不能表示为编译时常量表达式,而switch语句需要它.
Jör*_*ann 29
这并没有真正回答你的问题,但如果你有代码取决于枚举值,你还可以在你的枚举中创建一个抽象方法,为每个值重载:
public enum EnumType {
ENUM1 {
@Override
public void doSomeStuff() {
// do something
}
},
ENUM2 {
@Override
public void doSomeStuff() {
// do something else
}
};
public abstract void doSomeStuff();
}
Run Code Online (Sandbox Code Playgroud)
Col*_*inD 20
由于您正在打开一个类型的对象,EnumType并且唯一可能的值是枚举常量,因此无需在交换机中再次限定这些常量.毕竟,case OtherEnumType.ENUM1:无论如何进入它都是违法的.