[英]Java-17 - switch case - Unused method parameters should be removed
我有一个简单的方法女巫接受了一个枚举并返回一个字符串:
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;
};
}
但是声纳给了我这个主要错误Unused method parameters should be removed 。
如您所见,参数类型在开关中使用。 有关更多详细信息,当我使用旧开关盒时,一切都很好。
关于这个问题的任何想法,声纳是否涵盖新的 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;
};
}
从Switch 表达式JEP,
穷尽
switch 表达式的情况必须是详尽无遗的; 对于所有可能的值,必须有一个匹配的开关标签。 (显然 switch 语句不需要详尽无遗。)
在实践中,这通常意味着需要一个默认条款; 但是,对于涵盖所有已知常量的
enum switch
表达式,编译器会插入一个 default 子句,以指示 enum 定义在编译时和运行时之间发生了变化。 依靠这种隐式的默认子句插入,可以生成更健壮的代码; 现在,当重新编译代码时,编译器会检查是否已明确处理所有情况。 如果开发人员插入了一个明确的默认子句(就像今天的情况),一个可能的错误将被隐藏。
Sonar 足够聪明,可以知道何时涵盖了所有基础,这使得默认条款不仅无法访问,而且会干扰上述行为。
这不是一个错误,Sonar 正确地评估了如果列表是详尽的,那么switch-expression永远不会落入default
分支。
另一方面,如果您不包含至少一个可能的枚举,则应该使用default
,否则代码将不会被编译,因为它必须涵盖关于是否穷举枚举或使用default
分支的所有可能性。
注意:您的代码包含 switch 表达式,而不是 switch 语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.