为什么Enum是Singleton的最佳实现

时间:2012-08-06 15:55:00

标签: java design-patterns enums singleton

我读过Effective Java,并指出Singleton最好用Enum实现。

  

这种方法在功能上等同于公共字段方法,除了它更简洁,免费提供序列化机制,并提供防止多个实例化的铁定保证,即使面对复杂的序列化或反射攻击。虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。

尽管如此,这似乎是在飞行序列化和真正的单个实例上实现的权衡,但是你放弃了经典单例的更友好的oop方法。枚举不能被继承,只能扩展一个接口,如果你想提供一个骨架类,你需要创建一个帮助类。

那么,除了上述原因之外,为什么我们应该接受Enum作为Singleton的最佳实现呢?

3 个答案:

答案 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

中定义的一次
  

枚举类型没有除其枚举常量定义的实例之外的实例。