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

Per*_*ium 6 java enums findbugs compilation

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

public enum Day {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 
   FILENOTFOUND //this one is new one
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    } 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Mar*_*ers 7

Eclipse有一个可以启用的编译时警告/错误:"switch"上没有包含枚举常量.

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

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

  • @rsp:当然,但这不是OP所要求的.他要求编译错误,这显然意味着他将重新编译客户端代码. (2认同)