Java 零实例枚举与防止实例化的私有构造函数

Java 零实例枚举与防止实例化的私有构造函数,java,enums,Java,Enums,一些实用程序类(想想java.lang.Math)只声明一个私有构造函数,以防止类的实例化 有没有什么特别的原因可以解释为什么这些类没有以0实例枚举的形式实现?在我看来,枚举比构造函数上的访问修饰符更直接地控制实例化。它还防止类本身创建实例,这样既可以防止程序员自食其果,又可以保证没有实例 Joshua Bloch提倡为单身人士使用枚举。这些好处不应该应用于0实例实用程序类吗 我的问题:0实例枚举与私有构造函数的优缺点是什么。(我个人认为使用enum没有缺点,尽管私有构造函数似乎是更普遍的方法。

一些实用程序类(想想
java.lang.Math
)只声明一个私有构造函数,以防止类的实例化

有没有什么特别的原因可以解释为什么这些类没有以0实例枚举的形式实现?在我看来,枚举比构造函数上的访问修饰符更直接地控制实例化。它还防止类本身创建实例,这样既可以防止程序员自食其果,又可以保证没有实例

Joshua Bloch提倡为单身人士使用枚举。这些好处不应该应用于0实例实用程序类吗

我的问题:0实例枚举与私有构造函数的优缺点是什么。(我个人认为使用enum没有缺点,尽管私有构造函数似乎是更普遍的方法。)


(我知道
java.lang.Math
早于
enum
。我这里说的是1.5+代码。)

无法实例化enum的事实是一个副作用。当您将某个对象声明为enum时,人们会期望它是enum;它将作为枚举出现在IDE、代码分析工具中

遵循最小惊讶原则,并且考虑到用户不关心您如何在内部实现这一点,我认为最好使用私有构造函数,并从该构造函数中抛出
错误
,如果有人尝试用反射来实例化它。

我不知道这两种方法都有任何技术缺陷

至于优雅,这是一个意见问题,与大多数计算机程序的真正目的并不特别相关


相比之下,可读性、可维护性和正确性是与目的相关的属性。有助于使程序可读的一个方面是使用其他程序员很容易识别的习惯用法。零实例
enum
类型是一个有趣的想法。。。但是私有构造函数是防止实例化的惯用用法。

因此,总结一下迄今为止的答案和评论:

支持0实例枚举的参数:

  • Enum解决了控制类实例化的问题,这正是0实例实用程序类所需要的

  • Weekday
    有7个实例,
    Month
    有12个,
    MySingleton
    有1个(根据Joshua Bloch的说法,应该通过枚举实现),而
    MyUtilityClass
    有0个实例。最后一个案例和前一个案例在概念上没有区别

  • 0实例枚举保证不会创建任何实例,甚至不会从类本身创建实例

针对0实例枚举的参数:

  • 不遵循最小惊讶的原则;当人们看到一个枚举时,他们希望它遵循教科书中非空枚举的示例,例如工作日、状态代码等

  • 0实例枚举是一种未被广泛使用的习惯用法,因此其他程序员不容易识别。也就是说,它的可读性不如使用私有构造函数

  • 枚举与隐式合成方法混杂在一起,这意味着自定义定义的方法不允许使用这些名称。此外,公共API公开了不应该使用的方法,这一事实可能会让人感到尴尬,也可能会让人崩溃

其他注释

  • 相关和

  • 关于这个问题


我看不到这里的优雅。一个单独的私有无参数构造函数对我来说已经足够好了。这很有趣。与枚举中的清单(0)实例相比,我发现通过构造函数上的访问修饰符来控制实例化有点间接。相关:,尤其是这个答案:对不起,StackOverflow问题不应该是关于特定编程问题吗?这个话题怎么样?不管最后一句话是哪种类型的问题需要一个具体的答案,它首先是一个火焰诱饵式的问题。我想问的是,在Java中使用0实例枚举是否有任何问题我已经看过了。我将尝试重新表述,以便它读起来更客观一点。。。(完成)+1这件事。这完全是出于意图。此外:枚举中充斥着隐式的合成方法,如果你打算永远不使用它们,那就不优雅了。“人们会期望它是一个枚举”——当然它是一个枚举。你可能想说“人们期望它有实例”?我买的最小惊讶原则,虽然这更多的是熟悉枚举的使用,而不是技术上的论证。@aioobe我同意,如果有其他一些常见的原因让枚举没有枚举常量,那就不会再令人惊讶了。这是一种观点。当我看到有人花时间编写构造函数只是为了阻止人们使用它时,我总是感到惊讶。然而,私有构造函数只阻止外部实例化,不保证没有实例。这就是艾奥贝的观点,这是一个很好的观点。也许。。。但这是标准的习语。此外,如果你想学究的话,零实例枚举并不能阻止某人以后添加实例。“标准惯用语”是支持私有构造函数的一个很好的论据,但由于它早于枚举,如果它所做的只是它在历史上一直是标准惯用语,在我看来,这似乎是审查该标准的一个理由,“自律”论点可以用来推翻几乎任何语言安全特性,例如整个静态类型系统。对某些财产进行简单明了的担保是很有价值的。我确实同意你的“最大限度的小利益”,我认为这是维持现状的主要原因。最好的办法是使用anno