Java IDE建议将final类更改为Enum
在我的代码库中,我发现了这样一个类:Java IDE建议将final类更改为Enum,java,intellij-idea,Java,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(Intel
public final class Klass
{
private static final long LONG_NUMBER = 10.0;
private Klass() {}
public static double calcSomethingUsingLongNumberAndParam(double param)
{
...
return something;
}
}
我的IDE(IntelliJ IDEA)对此类提供了一个“改进”——将其更改为枚举。作为测试,我做了更改,并注意到没有对任何成员字段或方法进行其他重构,也没有对包含的静态方法进行任何调用
以下是生成的枚举:
public enum Klass
{
;
private static final long LONG_NUMBER = 10.0;
private Klass() {}
public static double calcSomethingUsingLongNumberAndParam(double param)
{
...
return something;
}
}
将最后一个类更改为枚举有好处吗?或者这是IDE的一个怪癖吗?我最初的回答是肯定有好处的,枚举几乎在所有方面都取代了旧式的POJO单例(这是它的特例)。然而,这在一定程度上取决于所涉及的用例和实际代码。如果您只是将“final class”替换为“enum”,就像IDE在本例中所做的那样,那么好处是微乎其微的。另外,使用enum的一个主要好处是可以更好地检查有限值的类型,但是由于您似乎只使用一个数值,而且它是私有的,所以在这里没有任何好处 使用枚举与常量实用程序类的优点:
- enum可以用更少的代码实现几乎相同的功能—您不需要将函数或值声明为静态,也不需要私有构造函数,它们只是enum提供的现成样板
- 很明显,枚举并不意味着要实例化它们,而对于这样的类,可能需要进行更多的调查并从整体上查看其细节
- 对于这样一个类,更新代码的人如果没有注意到应该这样做的话,会更容易意外地弄乱单例模式
- enum类本身实际上是最终的,但它们的内部设计取决于为enum值生成子类的可能性,因此它们对子类的保护在我看来有点粗糙
TLDR;使用enum替换的建议似乎是合理的,至少如果您省略了不必使用enum显式声明的内容。但是,这些差异与可读性和可维护性有关,而不是行为上的任何差异。将此类更改为枚举没有任何直接的好处 它提供给您的唯一功能是省略私有构造函数(以及类上的
final
)
但您也需要一个单一的值(您不需要),或者只需要一个随机挂起的
将(空)值列表与类正文的其余部分分开。您能显示生成的枚举是什么样子吗?实际上,您最好将其设置为接口,因为它只有静态字段,没有成员方法。@daniu否,接口用于类型。出现Klass
的实例意味着什么?(在有效的Java中有一条专门针对这一点的规定)。“枚举类本身不能是最终的,因为它们的内部设计取决于为枚举值生成子类的可能性。因此,你不能从子类中得到保护。”呃?不能扩展枚举或其值。@AndyTurner不能在枚举类定义之外扩展它们。它的成员确实扩展了枚举。但我确实是用一种令人困惑的方式写的。我会努力让它变得更好。。。