首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应该删除Java-17 -开关用例-未使用的方法参数。

应该删除Java-17 -开关用例-未使用的方法参数。
EN

Stack Overflow用户
提问于 2021-10-19 13:05:14
回答 2查看 768关注 0票数 4

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

代码语言:javascript
复制
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;
    };
}

但是声纳给了我一个重大的错误:应该删除未使用的方法参数。

如您所见,开关中使用了参数类型。关于更多细节,当我使用旧的开关箱时,每件事都是可以的。

对于这个问题,声纳是否涉及新的Java语法?

嗯,我注意到当我移除default -> null;声纳时,正确通过!这太奇怪了。

代码语言:javascript
复制
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;
    };
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-19 13:30:57

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2021-10-19 13:31:04

从技术上讲,语法default -> null;不是“参数”。JLS将开关块中的各种组件称为“规则”、“标签”或“表达式”;而相关的杰普也使用“子句”一词。

不管您将其称为什么组件,开关表达式都不同于旧的Switch语句。特别是,开关表达式是详尽的。

从杰普,

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

声纳是足够聪明的知道什么时候所有的基地都涵盖了,使默认子句不仅无法到达,而且使它干扰上述行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69631357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档