我的开关中有79个案例。
switch (field) {
case "ALL_STATUS":
allowedAllStatus = allowedValues.split("=");
break;
case "APPLICATION_TYPE":
allowedApplicationType = allowedValues.split("=");
break;
case "CONTACT_LOCATION":
allowedContactLocation = allowedValues.split("=");
break;
...
当我将应用程序运行到sonarqube时,它要求我减少案例数量:
Reduce the number of switch cases from 79 to at most 30
现在,在每种情况下我都需要执行相同的功能allowedValues.split("=")
。因此,我决定制作一个hashmap并将案例中的所有值放在那里,然后根据关键字段调用该函数。
现在,我想问一下,按照我重构的方式来做它是否有效 - 记忆明智还是时间明智?
答案 0 :(得分:6)
79元素的switch-case语句几乎总是一个坏兆头。它不仅复制了许多类似的代码,而且还很难维护。如果你需要改变它的任何内容,我保证你会因为没有采取不同的处理而生气。
在这种情况下,如果您希望按名称提供多个String(Array?)属性并从文件中读取,则Map是目前最优的解决方案。在这种情况下,没有10字节的内存差别会对你造成伤害。
答案 1 :(得分:1)
哈希映射通常非常有效。在大多数情况下,它将与O(1)复杂度一起工作,与switch语句相同。即使它应该稍慢,我认为它甚至不会引人注意。
当然它需要比switch语句更多的内存,但是如果你让hashmap成为一个静态的最终变量(我相信你应该这样做)它只会被分配一次,而且再次影响将非常困难注意。很确定您已经拥有或将在您的应用程序中拥有更大的哈希映射。我还建议您使用来自java.util.Collections的unmodifiableMap或来自guava的ImmutableMap,以确保它在运行时不会被更改。
这也是该方法使用频率的问题,但即使它是应用程序的关键组件,也不应以任何方式显着影响效率(但代码的可读性很多 - 当然是积极的方式) )。