对Enum Singletons有处罚吗?

aka*_*okd 2 java singleton enums

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

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

Mar*_*cin 5

所有Java单例模式(包括此标准和私有构造函数和静态访问器的标准)都具有这种不良属性,如果您测试它们(或测试甚至远程依赖它们的任何东西),则可以使用此对象.

例如,如果你想测试PrintingService依赖于PrintingSingleton你的类将无法用mock替换这个打印单例,因为它是静态绑定的.

即想象一下测试这个功能

boolean printDocument(Document d) {
  if (PrintingSingleton.INSTANCE.isPrinterEnabled()) {
    PrintingSingleton.INSTANCE.print(d);
  }
  throw new RuntimeExeption("Printing not enabled");
}
Run Code Online (Sandbox Code Playgroud)

通过测试

@Test(expectedExceptions = {RuntimeException.class})
public void testPrinting() {
  PrintingService service = ...
  service.print(new Document());  // How will you simulate 
                                  // throwing an exception?
} 
Run Code Online (Sandbox Code Playgroud)

就个人而言,我只是避免使用单例,而是通过Guice,Spring或Pico Container引入依赖注入.这样你就可以确保只存在一个对象,同时不限制自己无法模拟对象,例如测试.

  • 测试不应该影响设计决策.测试总是围绕现有架构构建. (3认同)