假设您有一个包含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的欺骗。由于答案是“否”,这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?
答案 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语句中提供默认值并引发异常。此外,您应该有足够的单元测试来测试这种情况,如果您编译项目并且所有单元测试都没问题,这将意味着您没有进行足够深度的测试。