这个问题在这里已有答案:
我只是在这个代码上挣扎:
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()
取代了上面的大部分代码
如果您引入新的ChangeType
值,则具有异常的默认情况将作为帮助程序。说你添加了第四种类型UPSERT
。这个switch
语句可能位于代码库中的多个位置,它们仅用于处理CREATE
,MODIFY
,DELETE
,并且不期望新的UPSERT
值。唯一的例外是fail-fast approach会立即告诉你事情并没有像预期的那样。