没有值的java枚举和带有私有构造函数的实用程序类之间的区别

2022-09-01 04:58:25

对实用程序类执行的一个常见操作是为它们提供一个私有构造函数

public final class UtilClass {
    private UtilClass() {}

    ...
}

但不幸的是,有些工具不喜欢这个私有构造函数。他们可能会警告说,它从未在类中被调用,测试未涵盖它,该块不包含注释等。

如果您这样做,则许多警告会消失:

public enum UtilClass {;
    ...
}

我的问题是:除了对未来开发人员无休止的仇恨之外,没有值的枚举和Java中具有私有构造函数的类之间有什么重要的区别?

请注意,我不是在问Java枚举与具有公共静态最终字段的类相比有什么优势?我不是在决定一个事物列表应该是一堆常量还是一个枚举之间,而是在将一堆函数放在无构造函数类或无值枚举之间做出决定。

另请注意,我实际上并不想这样做。我只是想知道作为一般语言知识的一部分的权衡。

例如,使用枚举会用无用的方法污染自动完成,例如。还有哪些其他缺点?好处?UtilClass.values()


答案 1

用于实际上不是枚举的东西是丑陋和令人困惑的。我会说这足以成为不这样做的理由。enum

“效用类”模式是完全合法的。如果您的工具不喜欢它,那就是工具的问题。


答案 2

一个好处是,您可以绝对保证不能创建任何实例,即使从类内部也是如此。

缺点是这超出了枚举的通常意图。但是,我们已经为使用枚举实现的单例执行此操作。

Joshua Bloch的“Effective Java”中关于这种单例的这一点也适用于实用程序类:

...你得到了一个铁定的保证,除了声明的常量之外,不可能有实例。JVM 提供了此保证,您可以依赖它。

免责声明:我没有使用过这种模式,我不建议或反对它。