是否有(性能)惩罚*以任何方式与Enum Singleton Pattern相关联,因为它似乎比传统的单例模式或内部持有者类习惯用得少?
*惩罚,例如在不需要的情况下可串行化的成本等,或者因为很少有开发人员阅读Effective Java 2nd Edition而使用率很低?
答案 0 :(得分:5)
所有Java单例模式(包括此标准和私有构造函数和静态访问器的标准)都具有这样的错误属性,如果您测试它们(或测试甚至远程依赖它们的任何东西),则可以使用此对象。 / p>
例如,如果要测试依赖于PrintingService
的{{1}}类,则无法使用模拟替换此打印单例,因为它是静态绑定的。
即。想象一下测试这个功能
PrintingSingleton
带有测试
boolean printDocument(Document d) {
if (PrintingSingleton.INSTANCE.isPrinterEnabled()) {
PrintingSingleton.INSTANCE.print(d);
}
throw new RuntimeExeption("Printing not enabled");
}
就个人而言,我只是避免使用单例,而是通过Guice,Spring或Pico Container引入依赖注入。这样就可以确保只存在一个对象,同时不限制自己无法模拟对象,例如测试。
答案 1 :(得分:1)
对于使用基于枚举的单例,您不会受到任何性能损失,因为Enums实际上只是运行时的常规类。我想你可能会在类加载时获得非常轻微的性能,因为系统可能正在进行正确性所需的所有正确初始化。可序列化应该没有任何成本,因为它只是一个标记接口,只检查您是否尝试序列化。它确实是创造单身人士最着名的方法!