如何在 switch 语句中对案例进行分组?

How to group cases in a switch statment?

我的 Java switch 语句中目前有 31 个案例。本来有30个,现在又加了一个

这给了我this sonar issueReduce the number of non-empty switch cases from 31 to at most 30.

如何减少/分组语句的数量并保持原来的逻辑?

仅仅因为您的 Sonar 配置为在 31 个案例时触发并不意味着 30 个案例都可以。如果您有那么多案例,尤其是如果它们“失败”,您应该考虑使用其他类型的更适合您需求的条件逻辑。没有发布任何代码很难说。

声纳是一种工具。不是法官、陪审团或刽子手。它在黑暗中进行了一次疯狂的尝试,并通知您此代码 可能 是错误的代码风格。不能保证它是。声纳规则本身并不是风格指南。样式指南对于软件应用来说太复杂了。不,声纳规则只是一种试探法。过于简单化。因此,这个来自声纳的警告是否真的意味着你应该重构这段代码取决于两个因素:

  1. 一旦您完全理解导致此声纳规则的基本原理,您是否同意该原理?如果没有,请告诉声纳闭嘴(可能通过对整个代码库全局禁用此规则),添加你的第 31 个案例,然后继续。

  2. 如果你同意这个原则,请检查你的实际代码。 Sonar 正在考虑这个原则,如果将其应用于您获得的这个开关,则意味着您应该重构它。这是正确的吗?它可能不是。如果您认为没有,请添加您的第 31 个案例,然后继续。

  3. 如果你还在这里,那么这段代码总是不好的风格;添加第 31 个案例的行为并没有神奇地把它变成糟糕的风格,它一直都是。通过添加 31 号,你只是让声纳能够告诉你它,仅此而已。所以现在,做出决定,哪个原则对你更重要:“不要修复没有损坏的东西”或“重构糟糕的代码风格”?如果是“不修复未损坏的东西”,请添加您的第 31 个案例,添加注释以告诉声纳闭嘴,然后继续。

如果您已经通过了整个挑战,请重构此代码。仅仅是因为您现在意识到它现在已经并且已经有一段时间了。

没有一个灌篮高手的答案(这是这里的普遍趋势:编码很难。如果计算机可以应用的简单规则可以使代码变得更好,我们都会在坎昆喝着 mohitos,让计算机来做所有的编程)。

一个有用的一般原则是 Map<X, Handler>,其中 X 与 switch (X) { your 31 cases here } 中的表达式 X 的类型相同。现在您可以动态设置您的地图,例如将 31 个处理程序填充到 31 个单独的源文件中,并且可能使用 SPI;现在你可以创建一个新的 java 源文件,其中 class 实现了一个接口,添加一个 @Service 注释,然后,砰的一声,它现在是你以前 switch/case 的一部分构造。无需花时间维护所有 'handlers' 的列表,SPI 系统会自动完成。但那是一个很大的火箭筒,也许你只有一只蚊子。没有细节,我只能给你适用于所有情况的(通常更复杂的)工具。