为什么枚举是单例的最佳实现?


问题内容

我读了《有效Java》,其中指出最好使用来实现单例enum

此方法在功能上等效于公共领域方法,除了它更简洁,免费提供序列化机制,甚至针对复杂的序列化或反射攻击,还提供了针对多重实例化的明确保证。尽管此方法尚未得到广泛采用,但是单元素枚举类型是实现单例的最佳方法。

尽管如此,这似乎是在动态序列化和真正的单实例上实现的折衷方案,但您却失去了经典单例的更友好的OOP方法。枚举不能被继承,只能实现一个接口,如果要提供框架类,则需要创建一个帮助器类。

因此,除了上述原因之外,我们为什么还要接受枚举作为单例的最佳实现?


问题答案:

这似乎是在快速进行序列化时要取得的权衡

对我来说写这样的东西更简单,更简洁

enum Singleton {
    INSTANCE;
}

如果您需要编写更多代码或引入复杂性,则可以这样做,但是IMHO很少需要这样做。

您将失去经典单例的更友好的OOP方法。

我发现使用字段更简单。

枚举不能被继承,

没错,但是有多个单例本身就值得怀疑。枚举可以从接口继承,这使您可以将一种实现交换为另一种实现。

如果要提供骨架类,则需要创建一个辅助类

助手类没有任何状态。骨架类可能具有某种状态,在这种情况下,您需要委派。

顺便说一句:您可以使用enum帮助程序类

enum Helper {;
    public static my_static_methods_here;
}

为什么我们应该接受枚举作为单例的最佳实现

我会遵循YAGNI原则。仅开发所需的内容,而不开发您可能需要的内容。