当前位置: 首页 > 知识库问答 >
问题:

不带值的java枚举与带私有构造函数的实用程序类的区别

杨飞飙
2023-03-14
public final class UtilClass {
    private UtilClass() {}

    ...
}
public enum UtilClass {;
    ...
}

还要注意,我实际上并不想这么做。我只是想知道作为一般语言知识的一部分的取舍。

例如,使用枚举会用像utilclass.values()这样无用的方法污染autocomplete。还有哪些不利因素?向上?

共有1个答案

呼延俊风
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 实用程序类的常见操作是为它们提供一个私有构造函数: 但不幸的是,某些工具不喜欢该私有构造函数。他们可能会警告说,它从来没有在类中被调用过,它没有被测试所覆盖,该块不包含注释,等等。 如果您改为执行以下操作,则许多警告将消失: 我的问题是:除了对未来开发人员的无休止的仇恨之外,没有值的枚举和Java中带有私有构造函数的类之间还有什么重要区别? 请注意,我 并不是在 问Java枚举与带有公

  • 问题内容: 最近,我经常使用枚举。所以我想知道… 私有Enum构造函数和带有任何可见性修饰符(package-private)的枚举构造函数之间有什么区别吗? 问题答案: 根据java 文档 枚举类型的构造函数必须是程序包私有或私有访问。 但加入了JLS 如果没有为枚举类型的构造函数指定访问修饰符,则该构造函数为私有。 因此,package-private和private之间没有区别。

  • 问题内容: 我试图了解Java枚举是如何工作的,我得出的结论是,它与将其构造函数声明为private的普通Java类非常相似。 我刚刚得出这个结论,它并不是基于太多的思考,但是我想知道我是否错过了任何事情。 因此,下面是一个简单的Java枚举和一个等效的Java类的实现。 上面和下面的代码在含义上有什么区别? 问题答案: 差异: 枚举扩展并获得其所有不错的功能: 通过正确的序列化自动实现单例行为

  • 我在某处看到了枚举的以下解决方案 这证明了我想做的,除了ArrayBuffer中隐藏了一个var......这有点令人讨厌。 我真正想要的是val lookupTable=Map(),当一个请求进来时,我可以查找“星期一”并将其转换为我的枚举星期一并在整个软件中使用枚举。这通常是如何做到的。我看到了密封的特征,但没有看到一种方法来自动确保当有人添加扩展它的类时,它会自动添加到查找表中。有没有办法使

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

  • 问题内容: 由于枚举构造函数只能由其常量调用,因此为什么要允许它成为包私有的? 问题答案: 构造函数实际上不是包私有的…隐式地意味着接口方法是隐式的,即使您不添加关键字也是如此。 JLS(第8.8.3节)的相关部分规定: 如果没有为普通类的构造函数指定访问修饰符,则该构造函数具有默认访问权限。 如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为。 如果枚举类型(第8.9节)的构造函数声明为或