对Enum Singletons有处罚吗?

时间:2009-07-19 10:44:53

标签: java enums singleton

是否有(性能)惩罚*以任何方式与Enum Singleton Pattern相关联,因为它似乎比传统的单例模式或内部持有者类习惯用得少?

*惩罚,例如在不需要的情况下可串行化的成本等,或者因为很少有开发人员阅读Effective Java 2nd Edition而使用率很低?

2 个答案:

答案 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实际上只是运行时的常规类。我想你可能会在类加载时获得非常轻微的性能,因为系统可能正在进行正确性所需的所有正确初始化。可序列化应该没有任何成本,因为它只是一个标记接口,只检查您是否尝试序列化。它确实是创造单身人士最着名的方法!

相关问题