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

时间:2010-10-22 18:47:34

标签: java enums compilation findbugs

我不得不在项目中为枚举类型添加新值。

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;
    } 

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

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

我认为Findbugs会有规则找到那些,但我只看到了这个: Eq: Covariant equals() method defined for enum (EQ_DONT_DEFINE_EQUALS_FOR_ENUM)

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

3 个答案:

答案 0 :(得分:7)

Eclipse有一个编译时警告/错误,您可以启用:“切换”未包含的枚举常量。

从项目属性(或常规首选项),转到 Java编译器 - > 错误/警告,选中启用项目特定设置 。您将在潜在编程问题下找到警告。默认设置为忽略,但您可以将其提升为警告错误

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

答案 1 :(得分:2)

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

switch (color) {
default:
    log.error("Unknown color in switch: " + color);
    break

case MONDAY: /*FALLTHROUGH*/
case TUESDAY: 

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

修改从Mark答案的评论中复制的澄清:

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

除非针对新版本重新编译,否则它不会使包含枚举开关的cient代码对更改具有强大的功能。

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

答案 2 :(得分:0)

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