为什么我的Java编译器在完整的switch语句中强制使用默认情况? [重复]

问题描述 投票:0回答:1

我只是在这个代码上挣扎:

int convert(ChangeType changeType) {
  switch (changeType) {
    case CREATE:
      return 1;
    case MODIFY:
      return 2;
    case DELETE:
      return 3;
    default:
      throw new InternalError("changeType is null");
  }
}

和相应的枚举:

public enum ChangeType {
  CREATE, MODIFY, DELETE;
}

我想知道:默认子句显然是错误的,因为它意味着捕获null,但是null将在列表的第2行调用NPE。

但是在进行实验时,我发现删除默认情况最终会出现在编译错误“missing return statement”中,但是如果没有向枚举添加更多值,则此开关是“完整的”,并且没有这样的未覆盖的代码路径。

问:那么,是否真的期望(作为此枚举的用户),我添加一个默认情况,实际上是一个死(和不可测试)代码路径,除非有人更改枚举?

相反,我甚至希望像Sonar这样的代码分析器会警告是否存在完整的开关和默认情况。

PS:代码只是一个例子。我知道有Enum.ordinal()取代了上面的大部分代码

java enums java-8 switch-statement
1个回答
0
投票

如果您引入新的ChangeType值,则具有异常的默认情况将作为帮助程序。说你添加了第四种类型UPSERT。这个switch语句可能位于代码库中的多个位置,它们仅用于处理CREATEMODIFYDELETE,并且不期望新的UPSERT值。唯一的例外是fail-fast approach会立即告诉你事情并没有像预期的那样。

© www.soinside.com 2019 - 2024. All rights reserved.