繁体   English   中英

Java-17 - 切换案例 - 应删除未使用的方法参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM