【发布时间】:2023-04-01 20:11:01
【问题描述】:
实用程序类的常见做法是give them a private constructor:
public final class UtilClass {
private UtilClass() {}
...
}
但不幸的是,有些工具不喜欢那个私有构造函数。他们可能会警告它从未在类中被调用,它未被测试覆盖,该块不包含注释等。
如果你这样做,很多警告就会消失:
public enum UtilClass {;
...
}
我的问题是:除了对未来开发者的无休止的仇恨之外,在 Java 中没有值的枚举和具有私有构造函数的类之间有什么重要区别?
请注意,我不是在问What's the advantage of a Java enum versus a class with public static final fields?。我不是在决定一个事物列表是应该是一堆常量还是一个枚举,而是在将一堆函数放在一个无构造函数的类中还是一个无值的枚举中。
还请注意,我实际上并不想这样做。我只是想知道作为一般语言知识的一部分的权衡。
例如,使用枚举会用UtilClass.values() 之类的无用方法污染自动完成功能。还有哪些其他缺点?优点?
【问题讨论】:
-
我看到的主要缺点是它令人困惑。开发人员希望枚举是一个枚举,并且有实例,而不是伪装成枚举的实用程序类。
-
我认为对未来开发者无休止的仇恨是避免此类事情的充分理由。感觉这是一种避免工具警告的解决方法。如果这种模式变得足够普遍,工具最终也会发出警告。
-
实际上,一个空的
enum应该比私有默认构造函数触发一个更严重的警告。 -
Enums 是 Java 的一个被低估的特性。他们拥有大多数人永远不会想到的各种uses,而且在我看来,大多数开发人员人为地限制他们的能力这一事实并不是你这样做的好理由。话虽如此,这不是我通常做的。 -
附带说明,我通常用
throw new AssertionError()填充空的构造函数。实例化实用程序类是果断地(?)错误的。
标签: java enums private-constructor