Java-17 - switch case -应删除未使用的方法参数



我有一个简单的方法,它接受一个enum并返回一个String:

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;
};
}

但是Sonar给了我这个主要错误:未使用的方法参数应该被删除。

可以看到,参数类型在交换机中使用。对于更多的细节,当我使用旧的开关箱时,一切都很好。

关于这个问题有什么想法吗,sonar是否涵盖了新的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;
};
}

这不是一个错误,Sonar正确地评估,如果清单是穷尽的,开关表达式永远不会落入default分支。

另一方面,如果决定不列出所有可能的枚举常量,则必须声明default分支。否则,代码将不可编译,因为要求每个枚举常量都可以匹配。

注意:你的代码中包含一个switch表达式,而不是一个switch语句。

从技术上讲,语法default -> null;不是一个"参数"。JLS将开关块中的各种组件称为"规则"、"标签"或"表达式"。而相关的JEP也使用术语"条款"。

不管你怎么称呼它的组件,Switch表达式与旧的Switch语句是不同的。特别是,Switch表达式是穷举的

来自JEP,

穷尽性

switch表达式的case必须是穷举的;对于所有可能的值,必须有一个匹配的开关标签。(显然,switch语句不需要是穷举的。)

在实践中,这通常意味着需要一个默认子句;但是,对于覆盖所有已知常量的enum switch表达式,编译器会插入一个默认子句,以指示枚举定义在编译时和运行时之间发生了变化。依赖于这种隐式的默认子句插入使代码更健壮;现在,当代码重新编译时,编译器检查是否显式处理了所有情况。如果开发人员插入一个显式的默认子句(就像今天的情况一样),一个可能的错误将被隐藏。

Sonar足够聪明,可以知道所有的基地何时被覆盖,使默认子句不仅无法访问,而且使其干扰上述行为。

最新更新