我有一个简单的方法,它接受枚举并返回一个字符串:
public static String enumToString(MyEnum type) {
return switch (type) {
case Enum1 -> "String_1";
case Enum2 -> "String_2";
case Enum3 -> "String_3";
case Enum4 -> "String_4";
case Enum5 -> "String_5";
case Enum6 -> "String_6";
default -> null;
};
}但是声纳给了我一个重大的错误:应该删除未使用的方法参数。。
如您所见,开关中使用了参数类型。关于更多细节,当我使用旧的开关箱时,每件事都是可以的。
对于这个问题,声纳是否涉及新的Java语法?
嗯,我注意到当我移除default -> null;声纳时,正确通过!这太奇怪了。
public static String enumToString(MyEnum type) {
return switch (type) {
case Enum1 -> "String_1";
case Enum2 -> "String_2";
case Enum3 -> "String_3";
case Enum4 -> "String_4";
case Enum5 -> "String_5";
case Enum6 -> "String_6";
//default -> null;
};
}发布于 2021-10-19 13:30:57
这不是一个bug,Sonar正确地评估,如果清单是详尽的,开关表达式就永远不会落入default分支中。
另一方面,如果您决定不列出所有可能的枚举常量,则必须声明default分支。否则,代码将无法编译,因为每个枚举常量都可以匹配。
注意:您的代码包含一个switch表达式,而不是switch语句。
发布于 2021-10-19 13:31:04
从技术上讲,语法default -> null;不是“参数”。JLS将开关块中的各种组件称为“规则”、“标签”或“表达式”;而相关的杰普也使用“子句”一词。
不管您将其称为什么组件,开关表达式都不同于旧的Switch语句。特别是,开关表达式是详尽的。
从杰普,
Exhaustiveness 开关表达式的情况必须详尽无遗;对于所有可能的值,必须有一个匹配的开关标签。(显然,开关语句不需要详尽无遗。) 在实践中,这通常意味着需要一个默认子句;但是,对于覆盖所有已知常量的
enum switch表达式,编译器将插入一个默认子句,以指示枚举定义在编译时和运行时之间发生了变化。依赖于此隐式默认子句插入可以使代码更加健壮;现在,当重新编译代码时,编译器将检查是否显式地处理了所有情况。如果开发人员插入了一个显式的默认子句(就像现在的情况一样),可能的错误就会被隐藏起来。
声纳是足够聪明的知道什么时候所有的基地都涵盖了,使默认子句不仅无法到达,而且使它干扰上述行为。
https://stackoverflow.com/questions/69631357
复制相似问题