实用程序类的常见操作是为它们提供一个私有构造函数:
public final class UtilClass {
private UtilClass() {}
...
}
但不幸的是,某些工具不喜欢该私有构造函数。他们可能会警告说,它从来没有在类中被调用过,它没有被测试所覆盖,该块不包含注释,等等。
如果您改为执行以下操作,则许多警告将消失:
public enum UtilClass {;
...
}
我的问题是:除了对未来开发人员的无休止的仇恨之外,没有值的枚举和Java中带有私有构造函数的类之间还有什么重要区别?
请注意,我 并不是在
问Java枚举与带有公共静态final字段的类相比有什么优势?。我不是在确定列表应该是一堆常量还是枚举之间,而是在将一堆函数放在没有构造函数的类或没有值的枚举之间。
另请注意,我实际上并不想这样做。我只是想知道折衷方法,作为一般语言知识的一部分。
例如,使用枚举会使用诸如的无用方法来污染自动完成功能UtilClass.values()
。还有哪些其他缺点?有好处吗?
好处之一是,您可以绝对确保即使在类内部也不能创建任何实例。
缺点是,这超出了枚举的通常意图。但是,我们已经对使用枚举实现的单例执行了此操作。
约书亚·布洛赫(Joshua Bloch)的“有效Java”中有关此类单例的这一点也适用于实用程序类:
…您得到了铁定的保证,即声明的常量之外没有其他实例。JVM保证了这一点,您可以依靠它。
免责声明:我没有使用过这种模式,也不建议您赞成或反对它。
还要注意,我实际上并不想这么做。我只是想知道作为一般语言知识的一部分的取舍。 例如,使用枚举会用像这样无用的方法污染autocomplete。还有哪些不利因素?向上?
问题内容: 最近,我经常使用枚举。所以我想知道… 私有Enum构造函数和带有任何可见性修饰符(package-private)的枚举构造函数之间有什么区别吗? 问题答案: 根据java 文档 枚举类型的构造函数必须是程序包私有或私有访问。 但加入了JLS 如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数为私有。 因此,package-private和private之间没有区别。
问题内容: 我试图了解Java枚举是如何工作的,我得出的结论是,它与将其构造函数声明为private的普通Java类非常相似。 我刚刚得出这个结论,它并不是基于太多的思考,但是我想知道我是否错过了任何事情。 因此,下面是一个简单的Java枚举和一个等效的Java类的实现。 上面和下面的代码在含义上有什么区别? 问题答案: 差异: 枚举扩展并获得其所有不错的功能: 通过正确的序列化自动实现单例行为
问题内容: 由于枚举构造函数只能由其常量调用,因此为什么要允许它成为包私有的? 问题答案: 构造函数实际上不是包私有的…隐式地意味着接口方法是隐式的,即使您不添加关键字也是如此。 JLS(第8.8.3节)的相关部分规定: 如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。 如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为。 如果枚举类型(第8.9节)的构造函数声明为或
或修饰符不允许与构造函数一起使用。为什么?我试过阅读标准文档,但没有很好地理解它。
我有一个java类,它只有静态方法和字段,所以我不想为此创建任何对象。我可以从两个方面来理解, 创建类摘要 使用私有构造函数。 这两种方法哪一种更好?