Java 为什么,当switch语句中的每个enum常量都有实例时,我还必须提供默认值?
我试图在Java中声明一个枚举,并在switch语句中使用该类型的变量,其中涵盖了该类型枚举常量的所有可能情况Java 为什么,当switch语句中的每个enum常量都有实例时,我还必须提供默认值?,java,enums,Java,Enums,我试图在Java中声明一个枚举,并在switch语句中使用该类型的变量,其中涵盖了该类型枚举常量的所有可能情况 enum MyEnum { FOO, BAR } private static void test(MyEnum e) { String msg; switch (e) { case FOO: msg = "foo"; break; case BAR:
enum MyEnum {
FOO,
BAR
}
private static void test(MyEnum e) {
String msg;
switch (e) {
case FOO:
msg = "foo";
break;
case BAR:
msg = "bar";
break;
}
System.out.println("Enum is: " + e + " msg is: " + msg); //compiler error
}
为什么编译器无法检测到此开关将始终初始化
msg
(或者因为e
为null
而引发NullPointerException)?想象一下如果MyEnum
是一个单独的类。然后可以重新编译MyEnum
类,并添加新值,而无需重新编译EnumSwitchTest
(这样就不会出现任何错误)
然后,另一个类可以使用新值调用
test
。我不知道一个可以使用switch语句的解决方案,但是您可以使用,它提供了一个注释处理器,可以确保在编译时处理所有枚举常量。我想这和你要求的结果是一样的
此外,它还支持反向查找和部分映射程序。可以使用一些反射开关创建枚举的新实例。@immibis即使可能,编译器也不必为此费心。大多数编译器都能够检测到这一点,但是Java语言规范不允许他们中止编译。相反,它只是一个关于枚举值缺少开关案例的警告。在编译时无法强制使用switch/case单独覆盖所有案例。如果必须为所有枚举常量返回一个值,例如,可以将该值设置为枚举的字段。