代码之家  ›  专栏  ›  技术社区  ›  Persimmonium

如何检测新值已添加到枚举中,并且未在开关中处理。

  •  6
  • Persimmonium  · 技术社区  · 14 年前

    有时我必须在我的项目中向枚举类型添加一个新值。

    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)

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

    3 回复  |  直到 7 年前
        1
  •  7
  •   Mark Peters    14 年前

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

    从项目属性(或常规首选项)转到 Java编译器 -gt; 错误/警告 ,检查 启用项目特定设置 . 你会发现下面的警告 潜在的编程问题 . 设置为 忽略 默认情况下,但您可以将其提升到 警告 误差 .

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

        2
  •  2
  •   rsp    14 年前

    您可以通过添加一个默认子句并在访问它时进行日志记录来做到这一点:

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

    (添加fallthrough注释有助于以后的维护人员决定是否忘记了代码:-)

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

    这样的一个IDE特性信号案例对于开发人员来说在发生变化的时候是可以的,但是它不会捕获代码所依赖的其他部分的变化。

    它不会使包含枚举开关的有效代码对更改具有鲁棒性,除非它们针对新版本重新编译。

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

        3
  •  0
  •   Peter Lawrey    14 年前

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