6

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

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 方面的专家,所以我可能错过了这样的功能,尽管我不这么认为。

4

3 回答 3

8

Eclipse 有一个可以启用的编译时警告/错误:“开关”上未涵盖枚举常量。

从您的项目属性(或一般首选项)中,转到Java Compiler -> Errors/Warnings,选中Enable project specific settings。您会在潜在编程问题下找到警告。默认情况下它设置为Ignore,但您可以将其提高到WarningError

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

于 2010-10-22T18:52:59.083 回答
2

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

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

case MONDAY: /*FALLTHROUGH*/
case TUESDAY: 

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

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

像这样的 IDE 功能信号案例在更改时对开发人员来说很好,但它不会捕获您的代码所依赖的其他代码部分的更改。

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

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

于 2010-10-22T18:53:00.143 回答
0

IntelliJ 是一种检查,并非所有大小写都已设置。它有一个自动修复来填补缺失的案例。

于 2010-10-22T20:39:43.983 回答