有没有办法强制你在Java中切换枚举的所有定义值?

时间:2017-09-10 18:27:10

标签: java enums switch-statement

假设您有一个包含3个值的枚举:

enum Colors { RED, GREEN, BLUE }

你在某种方法中切换它的所有值,认为你已经处理了所有情况:

switch (colors) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}

然后,您将在枚举中添加一个新值:

enum Colors { RED, GREEN, BLUE, YELLOW }

除了你在方法中默默地错过了YELLOW的情况之外,一切都还可以编译好。有没有办法在这种情况下引发编译时错误?

编辑:不明白为什么这被标记为Can I add and remove elements of enumeration at runtime in Java的欺骗。由于答案是“否”,这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?

3 个答案:

答案 0 :(得分:8)

没有。但是枚举是课程。所以你可以使用多态:

enum Color { 
    RED {
        @Override
        public void foo() { ... }
    },
    GREEN {
        @Override
        public void foo() { ... }
    },
    BLUE {
        @Override
        public void foo() { ... }
    };

    public abstract void foo();
}

现在,如果添加颜色,编译器将不允许您添加颜色,因为它不会覆盖抽象方法。

而不是

switch (color) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}

你可以使用

color.foo();

请注意,如果选择Kotlin,Kotlin可以做你想做的事。

另请注意,BLUE是一种颜色,而不是颜色。所以枚举应该命名为Color,而不是Colors。

答案 1 :(得分:6)

这取决于编译器。可以将Eclipse IDE内置编译器配置为在这种情况下引发错误。

Windows / Preferences Java编译器错误/警告"不完整'切换'关于枚举的案例"可以设置为"错误"。

编辑:

即使默认情况下,也会有一个子选项"信号'案件存在"。

答案 2 :(得分:1)

我不认为有这样做的默认方式。有可能使用一些外部工具。

为什么不在switch语句中提供默认值并引发异常。此外,您应该有足够的单元测试来测试这种情况,如果您编译项目并且所有单元测试都没问题,这将意味着您没有进行足够深度的测试。