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

YCF*_*F_L 7 java sonarqube switch-expression java-17

我有一个简单的方法,它接受一个枚举并返回一个字符串:

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;
    };
}
Run Code Online (Sandbox Code Playgroud)

但是声纳给了我这个 Major error: Unused method参量应该被删除

正如您所看到的,参数类型用于开关中。有关更多详细信息,当我使用旧开关盒时,一切正常。

关于这个问题有什么想法吗,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;
    };
}
Run Code Online (Sandbox Code Playgroud)

Nik*_*las 4

这不是一个错误,Sonar 正确地评估,如果列表是详尽的,则 switch表达式永远不会落入default分支。

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

注意:您的代码包含 switch 表达式,而不是 switch 语句。

  • 该错误在于声纳“描述”问题的方式。这是一个带有误导性描述的“真实阳性”。但 Java 17 才发布几周……所以也许没有人向 SonarTube 团队报告这个问题。 (8认同)
  • 它不是一个参数。它是 switch 表达式中的**规则**。这就是误导性的。(这不是英语问题。这是 Java 术语问题。)(JEP 称它们为“clauses”,但 JLS 使用术语“rule”。JLS 胜过一切!) (5认同)
  • 但是如何使默认子句成为“未使用”的参数呢? (4认同)
  • @Naman:抱歉,但我没有指出报告的问题是编译问题。 (2认同)