我读过Effective Java,并指出Singleton最好用Enum实现。
这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多个实例化的铁定保证,即使面对复杂的序列化或反射攻击。虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。
尽管如此,这似乎是在飞行序列化和真正的单个实例上实现的权衡,但是你放弃了经典单例的更友好的oop方法。枚举不能被继承,只能扩展一个接口,如果你想提供一个骨架类,你需要创建一个帮助类。
那么,除了上述原因之外,为什么我们应该接受Enum作为Singleton的最佳实现呢?
答案 0 :(得分:16)
Enum can't be inherited
这是enum作为单身人士最好的部分之一。
如果您可以继承单身人士,则不再是单身人士。
答案 1 :(得分:15)
这似乎是实现快速序列化的权衡
对我来说,编写像
这样的东西要简单得多,也更简洁enum Singleton {
INSTANCE;
}
如果您需要编写更多代码或引入复杂性,请执行此操作,但这很少需要恕我直言。
你失去了对古典单身人士更友好的oop方法。
我发现使用字段更简单。
Enum不能继承,
是的,但拥有多个单身人士本身就是可疑的。枚举可以从接口继承,允许您将一个实现交换为另一个实现。
如果要提供骨架类,则需要创建辅助类
辅助类没有任何状态。一个骨架类可能有一些状态,在这种情况下你需要委托。
BTW:您可以将enum
用于帮助程序类
enum Helper {;
public static my_static_methods_here;
}
为什么我们应该接受Enum作为Singleton的最佳实现
我会遵循YAGNI原则。只开发你需要的东西,而不是你想象的那样。
答案 2 :(得分:11)
前一段时间在stackoverflow上有过类似的讨论:What is an efficient way to implement a singleton pattern in Java?
接受的答案提供了关于该主题的良好链接:
Joshua Bloch在他在Google I / O 2008的Effective Java Reloaded演讲中解释了这种方法:link to video。另见 幻灯片30-32(effective_java_reloaded.pdf):
重点是写一个真正的单身人士是非常困难的。枚举值保证只存在Java Language Specification §8.9:
中定义的一次枚举类型没有除其枚举常量定义的实例之外的实例。