如何检测新值已添加到枚举中,并且不在交换机中处理

我不时要在项目的枚举类型中添加一个新值。

public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, FILENOTFOUND //this one is new one } 

我想要的是每个我没有处理新值的开关都有编译时错误 ,如下所示:

 switch (color) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: System.out.println("Mondays are bad."); break; case FRIDAY: System.out.println("Fridays are better."); break; case SATURDAY: case SUNDAY: System.out.println("Weekends are best."); break; } 

有一个默认:抛出一些exception是不够好的,我希望它是编译时间。

我不认为这是可能的,但也许有人有一个巧妙的把戏……

我认为Findbugs有一个规则可以找到那些,但我只看到了这个: Eq:为枚举定义的协变equals()方法(EQ_DONT_DEFINE_EQUALS_FOR_ENUM)

编辑:我选择了Mark的回复,我确实使用了Eclipse,听起来就像我需要的那样! 我根本不是findbugs的专家,所以我可能错过了这样的function,尽管我不这么认为。

Eclipse有一个编译时警告/错误,你可以启用: “开关”不包括枚举常量。

从Project属性(或常规首选项),转到Java Compiler – > Errors / Warnings ,选中Enable project specific settings 。 你会在潜在的编程问题下找到警告。 它默认设置为Ignore ,但您可以将其提升为WarningError

编辑:我认为这是不言而喻的,但我想我无论如何都要说:这只适用于你在Eclipse中开发或使用它进行构建管理。 显然,Findbugs或类似的等价物将是“真正的”答案,因为它超越了IDE并且可以集成到构建过程中。

您可以通过添加默认子句并在访问时记录来执行此操作:

 switch (color) { default: log.error("Unknown color in switch: " + color); break case MONDAY: /*FALLTHROUGH*/ case TUESDAY: 

(添加fallthrough评论有助于以后的维护者决定是否忘记了代码:-))

从马克答案的评论中复制的编辑澄清:

像这样的IDEfunction信令情况对于开发人员来说在改变时是好的,但它不会捕获代码所依赖的代码的其他部分的更改。

除非根据新版本重新编译,否则它不会使包含枚举上的开关的cient代码对更改具有强大的可靠性。

当客户端代码记录未处理的案例时,它确实有用; 部署的代码并不总是完全控制其类路径或其上的库版本。

IntelliJ是一个检查,并非所有情况都已设置。 它有一个自动修复程序来填补缺失的案例。