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

2022-09-03 09:05:07

我读了有效的Java,其中指出单例最好使用.enum

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

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

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


答案 1

这似乎是实现动态序列化的权衡

对我来说,写这样的东西要简单得多,更简洁。

enum Singleton {
    INSTANCE;
}

如果您需要编写更多代码或引入复杂性,请这样做,但恕我直言,这很少需要。

你失去了经典单例的更友好的OOP方法。

我发现使用字段更简单。

枚举不能被继承,

没错,但拥有多个单例本身就是可疑的。枚举可以从接口继承,这允许您将一个实现交换为另一个实现。

如果要提供框架类,则需要创建帮助程序类

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

顺便说一句:你可以用于帮助程序类enum

enum Helper {;
    public static my_static_methods_here;
}

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

我将遵循YAGNI原则。只开发你需要的东西,而不是你想象中可能需要的东西。


答案 2

枚举不能被继承

枚举中最好的部分是单例。

如果您可以从单例继承,则它不再是单例。


推荐