强制彻底切换

时间:2014-11-28 07:34:02

标签: java enums

是否有注释或其他方法将非详尽的switch语句警告变为错误?如果未正确处理所有值,我想要某个方法或类产生错误。

示例:

public enum E {
  A,
  B
}

和代码中的其他地方有一个像这样的枚举的开关

switch (enumValue) {
case A: /* do something */ break;
}

Java会向您发出警告,指出此开关不处理所有枚举值。我想将此警告转为错误(永久,无论各个IDE设置如何)。

请注意,在这种情况下我无法更改原始enum,所以我希望编译器强制执行它。

4 个答案:

答案 0 :(得分:4)

由于这是枚举,而不是switch语句,您可以使用抽象方法;所有枚举值都必须实现它。例如:

public enum MyEnum
{
    A {
        @Override public void foo() { /*whatever*/ }
    }
    // etc

    public abstract void foo();
}

然后在需要时调用yourEnum.foo(),而不是像目前那样使用switch语句。

不实现该方法不是一个选项......编译将失败。

答案 1 :(得分:4)

我知道这是一个旧线程,但是最新的JDK中有一个新答案:

开关表达式必须详尽无遗,并且可以在JDK 12和13中作为预览语言功能使用。

https://openjdk.java.net/jeps/354

这意味着您可以将需要验证的 switch 声明 修改为 switch 表达式 ,而其他switch语句将继续按预期工作。

答案 2 :(得分:3)

好吧,您可以更改IDE中的设置以将警告变为错误。

在Eclipse中,例如,在Window->Preferences->Java->Compiler->Errors/Warnings下,您可以决定是否应忽略Incomplete 'switch' cases on enum或产生警告或错误。

如果您的switch语句不在enum上,那么强制指定所有案例都没有意义,因为会有大量案例。

答案 3 :(得分:0)

像Checkstyle这样的Linters会对此进行标记,因此如果你构建了一个linter部分,那么你将得到一个"编译时间" (我知道它是编译后的一个阶段,但它基本上是相同的)警告。甚至还在Eclipse和IntelliJ中集成了Checkstyle(可能还有其他的linters),以便在IDE中标记它。