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实例实用程序类所需要的
有7个实例,Weekday
有12个,Month
有1个(根据Joshua Bloch的说法,应该通过枚举实现),而MySingleton
有0个实例。最后一个案例和前一个案例在概念上没有区别MyUtilityClass
- 0实例枚举保证不会创建任何实例,甚至不会从类本身创建实例
- 不遵循最小惊讶的原则;当人们看到一个枚举时,他们希望它遵循教科书中非空枚举的示例,例如工作日、状态代码等
- 0实例枚举是一种未被广泛使用的习惯用法,因此其他程序员不容易识别。也就是说,它的可读性不如使用私有构造函数
- 枚举与隐式合成方法混杂在一起,这意味着自定义定义的方法不允许使用这些名称。此外,公共API公开了不应该使用的方法,这一事实可能会让人感到尴尬,也可能会让人崩溃
- 相关和
- 关于这个问题