当前位置: 首页 > 面试题库 >

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

段干麒
2023-03-14
问题内容

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

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节)的构造函数声明为或

  • 或修饰符不允许与构造函数一起使用。为什么?我试过阅读标准文档,但没有很好地理解它。

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。