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

时间:2014-08-05 11:17:22

标签: java enums

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

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

约书亚布洛赫提倡使用枚举作为单身人士。 0-instance实用程序类不应该有同样的好处吗?

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

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

3 个答案:

答案 0 :(得分:3)

所以,总结到目前为止的答案和评论:

支持0实例枚举的参数:

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

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

针对0实例枚举的参数:

  • 不遵循最不惊讶的原则;当人们看到枚举时,他们希望它遵循非空的枚举的文本书示例,例如工作日,状态代码等。

  • 0实例枚举是一个未被广泛使用的习语,因此不是其他程序员容易识别的东西。即它比使用私有构造函数的可读性差。

  • 枚举使用隐式合成方法混乱,这意味着自定义方法不允许使用这些名称。此外,公共API公开不应使用的方法的事实可能从笨拙到破碎。

其他说明

答案 1 :(得分:2)

无法实例化枚举的事实是副作用。当你把一些东西宣布为枚举时,人们会认为它是一个枚举;它将在IDE,代码分析工具中显示为enum。

遵循最不惊讶的原则,并且鉴于用户并不关心你如何在内部实现这一点,我认为使用私有构造函数更好,并且还抛出{{1}如果有人试图用反射来实例化它,那么从该构造函数开始。

答案 2 :(得分:0)

我不知道这两种方法的任何技术缺点。

至于优雅,这是一个意见问题,而且(IMO)与大多数计算机程序的真实目的并不特别相关。

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