Java切换枚举不会检测到所有情况都被覆盖
我有一个问题,在java中使用switch语句中的枚举:
我在Java中声明Enum,并在switch语句中使用该类型的变量,其中涵盖了枚举值的所有可能情况。 在这个例子中,每个例子初始化一个在开关之前未初始化的变量,但是编译器仍然给我一个错误,因为javac不能识别出所有可能的情况都被覆盖了:
public class EnumSwitchTest {
public enum MyEnum {
FOO,
BAR
}
public static void main(String[] args) {
test(MyEnum.FOO);
test(MyEnum.BAR);
}
private static void test(MyEnum e) {
String msg;
switch (e) {
case FOO:
msg = "foo";
break;
case BAR:
msg = "bar";
break;
}
// Why does the compiler think it is possible to reach here
// and msg could still be uninitialized?
System.out.println("Enum is: " + e + " msg is: " + msg);
}
}
为什么编译器无法检测到这个开关总是会初始化msg
(或者因为e
为null
而抛出NullPointerException)?
我想要的是一个switch语句,它处理所有的情况,但是如果Enum类将来被扩展,但是没有新的情况被添加到交换机中,将会导致编译错误。
想象一下,如果MyEnum
是一个单独的类。 然后重新编译MyEnum
类并添加新值,而无需重新编译EnumSwitchTest
(因此不会出现任何错误)。
然后,另一个班级有可能用新的值调用test
。
我不知道可以使用switch-statement的解决方案,但是您可以使用Enum Mapper项目,它提供了一个注释处理器,它可以确保在编译时处理所有枚举常量。 我想这给出了你所要求的相同结果。
此外,它支持反向查找和paritial映射器。
链接地址: http://www.djcxy.com/p/88661.html上一篇: Java switch over an enum does not detect that all cases are covered