IDE建议从final类更改为Enum

时间:2018-05-03 05:34:30

标签: java intellij-idea

在我的代码库中,我找到了这样一个类:

punctuations

我的IDE(IntelliJ IDEA)为这个类提供了一个“改进” - 将其改为枚举。作为测试,我进行了更改,并注意到没有对任何成员字段或方法执行任何其他重构,也没有注意对所包含的静态方法的任何调用。

这是生成的枚举:

public final class Klass
{
   private static final long LONG_NUMBER = 10.0;

   private Klass() {}

   public static double calcSomethingUsingLongNumberAndParam(double param)
   {
     ...
     return something;
   }
}

将最终类更改为枚举是否有好处,或者这是IDE的怪癖?

2 个答案:

答案 0 :(得分:0)

我的回答最初说肯定有好处,枚举几乎在所有方面都取代旧式POJO单身人士(这是一个特例)。但是,它取决于用例和涉及的实际代码。如果你只是替换"最后的课程"使用" enum",就像IDE似乎在这种情况下所做的那样,好处很小。此外,使用枚举的主要好处之一是更好的类型检查有限值,但由于您似乎只使用单个数值而且它是私有的,因此它没有任何好处。

使用枚举与常量实用程序类的优点:

  • Enums通过更少的代码获得几乎相同的功能 - 您不需要将函数或值声明为静态,也不需要私有构造函数,这只是enum提供的开箱即用的样板< / LI>
  • 它立刻清楚地表明它们不是要实例化的,而对于像这样的类,它可能需要更多的调查并整体看一下它的细节
  • 有这样的课程,如果他/她没有注意到它意味着那样,更新代码就会更容易弄乱单身模式

缺点:

  • 枚举类本身实际上是最终的,但是它们的内部设计依赖于为枚举值创建子类的可能性,所以它们对子类的保护在我看来有点像hacky。

所以,如果这个类是作为外部库提供的接口的一部分,我们可以非常自信没有人会改变它自己的实现,它实际上比在这里使用枚举更安全。但是,如果维护此代码(特别是由不同的开发人员) - 并且任何代码应该是,我会认为枚举有更多的优点提供,因为它更清楚地传达其意图。即使是我唯一可以想到的,从子类化中删除保护,看起来也很微不足道,因为在定义的类之外,枚举实际上是最终的。

有关枚举益处的更多讨论,请参阅What are enums and why are they useful?。还有另一个关于在诸如你的常量实用程序类中使用final关键字的好处的讨论:Final Keyword in Constant utility class - 我从讨论中得出的结论是,唯一的好处是明确禁止将其子类化,因为你无法覆盖静态的东西,所以无论如何都不会工作。

TLDR;建议用枚举替换似乎是合理的,至少如果你省略了你不必用枚举明确声明的东西。但是,差异与可读性和可维护性有关,而与行为没有任何差异。

答案 1 :(得分:0)

将此类更改为枚举没有任何直接的好处。

它唯一能给你的是省略私有构造函数(以及类上的final)。

但是您还需要一个单独的值(您不需要),或者只是随机挂起;以将(空)值列表与其余的值分开上课。