零实例枚举vs私有构造函数,用于防止实例化

aio*_*obe 5 java enums

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

有没有什么特别的理由说明为什么这些类没有用0实例枚举实现?在我看来,enums是一种比构造函数上的访问修饰符更直接的控制实例化的方法.它还可以防止类本身创建实例,这些实例既可以防止程序员在脚中射击,也可以向外传递任何实例的保证.

约书亚布洛赫主张使用枚举作为单身人士.0-instance实用程序类不应该具有相同的优点吗?

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

(我知道java.lang.Math早些时候enum.我在这里说1.5+代码.)

Boz*_*zho 4

枚举无法实例化这一事实是一个副作用。当你将某个东西声明为枚举时,人们会期望它是一个枚举;它将在 IDE、代码分析工具等中显示为枚举。

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

  • 另外:枚举中充斥着隐式合成方法,如果您打算永远不使用它们,那么这并不优雅。 (3认同)