Java-17 - switch case - 应该删除未使用的方法参数
Posted
技术标签:
【中文标题】Java-17 - switch case - 应该删除未使用的方法参数【英文标题】:Java-17 - switch case - Unused method parameters should be removed 【发布时间】:2021-12-06 09:52:09 【问题描述】:我有一个简单的方法,它接受一个枚举并返回一个字符串:
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 给了我这个重大错误: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;
;
【问题讨论】:
@JohannesKuhn 不管怎样,如果type
是null
是不可能的——但后来我记得这个开关会导致NPE 被抛出。
为了未来读者的利益,您应该在此处提及所使用的 Sonar 版本。同意,报告的错误看起来不合适。
【参考方案1】:
这不是错误,Sonar 正确评估如果列表详尽switch-expression 永远不会落入default
分支。
另一方面,如果您决定不列出所有可能的枚举常量,则必须声明 default
分支。否则,代码将无法编译,因为要求每个枚举常量都可以匹配。
注意:您的代码包含 switch 表达式,而不是 switch 语句。
【讨论】:
但是如何使默认子句成为“未使用”参数? 问题在于 Sonar 描述问题的方式。这是带有误导性描述的“真正的肯定”。但是 Java 17 只发布了几个星期……所以也许没有人向 SonarTube 团队报告这个问题。 不是参数。它是 switch 表达式中的 rule。这就是误导。 (这不是英文问题。这是 Java 术语问题。)(JEP 称它们为“条款”,但 JLS 使用术语“规则”。JLS 胜过一切!) 我至少同意@StephenC 的描述应该不同并且更清楚地理解问题 @Naman:抱歉,我没有说报告的问题是编译问题。【参考方案2】:从技术上讲,语法default -> null;
不是“参数”。 JLS 将 switch 块中的各种组件称为“规则”、“标签”或“表达式”;而相关的JEP也使用“子句”一词。
无论您如何称呼它的组件,Switch Expressions 都不同于旧的 Switch Statements。特别是,开关表达式是详尽的。
来自 JEP,
详尽
switch 表达式的用例必须穷举;对于所有可能的值,必须有一个匹配的开关标签。 (显然 switch 语句不需要详尽。)
在实践中,这通常意味着需要一个默认子句;但是,对于涵盖所有已知常量的
enum switch
表达式,编译器会插入一个默认子句以指示枚举定义在编译时和运行时之间已更改。依靠这种隐式的默认子句插入可以得到更健壮的代码;现在,当重新编译代码时,编译器会检查所有情况是否都被显式处理。如果开发人员插入了一个显式的默认子句(就像今天的情况一样),一个可能的错误将会被隐藏。
Sonar 足够聪明,可以知道何时覆盖了所有基础,这使得默认子句不仅无法访问,而且会干扰上述行为。
【讨论】:
投反对票。原因 - 无法访问的子句与引发错误声明 “应删除未使用的方法参数” 无关。以上是关于Java-17 - switch case - 应该删除未使用的方法参数的主要内容,如果未能解决你的问题,请参考以下文章