为什么我的Java编译器在完整的switch语句中强制使用默认大小写?

时间:2019-03-19 11:22:23

标签: java enums java-8 switch-statement

我只是在这段代码上苦苦挣扎:

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。

但是,在进行试验时,我发现删除默认大小写会导致编译错误“缺少return语句”,但是在没有向枚举中添加更多值的情况下,此开关是“完整的”,并且没有这种未发现的代码路径。 / p>

问:那么,是否真的应该(作为该枚举的用户)添加一个默认情况,除非有人更改枚举,否则默认情况实际上是无效(且不可测试)的代码路径?

相反,我什至希望像Sonar这样的代码分析器会发出警告,如果有完整的开关 和默认情况。

PS:该代码仅是示例。我知道有Enum.ordinal()可以代替上面的大多数代码

1 个答案:

答案 0 :(得分:0)

如果您引入了新的ChangeType值,则带有例外的默认情况将作为帮助者。假设您添加了第四种类型UPSERT。该switch语句可能在代码库中的多个位置,仅用于处理CREATEMODIFYDELETE,并且不希望使用新的UPSERT值。 fail-fast approach例外,它会立即告诉您某些事情出乎意料之外。