将switch case重构为hashmaps:额外的内存使用量?

时间:2015-10-04 19:15:34

标签: java sonarqube

我的开关中有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并将案例中的所有值放在那里,然后根据关键字段调用该函数。

现在,我想问一下,按照我重构的方式来做它是否有效 - 记忆明智还是时间明智?

2 个答案:

答案 0 :(得分:6)

79元素的switch-case语句几乎总是一个坏兆头。它不仅复制了许多类似的代码,而且还很难维护。如果你需要改变它的任何内容,我保证你会因为没有采取不同的处理而生气。

在这种情况下,如果您希望按名称提供多个String(Array?)属性并从文件中读取,则Map是目前最优的解决方案。在这种情况下,没有10字节的内存差别会对你造成伤害。

答案 1 :(得分:1)

哈希映射通常非常有效。在大多数情况下,它将与O(1)复杂度一起工作,与switch语句相同。即使它应该稍慢,我认为它甚至不会引人注意。

当然它需要比switch语句更多的内存,但是如果你让hashmap成为一个静态的最终变量(我相信你应该这样做)它只会被分配一次,而且再次影响将非常困难注意。很确定您已经拥有或将在您的应用程序中拥有更大的哈希映射。我还建议您使用来自java.util.Collections的unmodifiableMap或来自guava的ImmutableMap,以确保它在运行时不会被更改。

这也是该方法使用频率的问题,但即使它是应用程序的关键组件,也不应以任何方式显着影响效率(但代码的可读性很多 - 当然是积极的方式) )。