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 (或者因为enull而抛出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

下一篇: Making templatized optimization more maintainable