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

假设你有一个3值的枚举:

enum Colors { RED, GREEN, BLUE } 

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

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

之后,您将为枚举添加一个新的值:

 enum Colors { RED, GREEN, BLUE, YELLOW } 

而且所有东西都编译得很好,除非你在方法中默默地忽略了YELLOW的情况。 有没有办法在这种情况下提出一个编译时错误?


编辑:不明白为什么这被标记为一个愚蠢的我可以添加和删除在Java运行时枚举的元素 。 由于答案是“否”,这意味着应该有可能在编译时知道枚举的所有值,因此我所要求的编译器/某些代码分析工具应该可以实现,对?

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

Windows / Preferences Java编译器错误/警告“枚举中的”不完整“开关”可以设置为“错误”。

编辑:

即使“默认”情况存在,甚至还有一个子选项“信号”。

但是枚举是类。 所以你可以使用多态:

 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可以做你想做的事情。

还要注意,蓝色是一种颜色,而不是一种颜色。 所以枚举应该被命名为颜色,而不是颜色。

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

为什么不在switch语句中提供一个默认值并引发异常呢? 此外,你应该有足够的单元测试来测试这个场景,如果你编译你的项目,并且你所有的单元测试都可以,那么这意味着你的测试不够深入。