我只是在这段代码上苦苦挣扎:
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()
可以代替上面的大多数代码
答案 0 :(得分:0)
如果您引入了新的ChangeType
值,则带有例外的默认情况将作为帮助者。假设您添加了第四种类型UPSERT
。该switch
语句可能在代码库中的多个位置,仅用于处理CREATE
,MODIFY
,DELETE
,并且不希望使用新的UPSERT
值。 fail-fast approach例外,它会立即告诉您某些事情出乎意料之外。