繁体   English   中英

如果不是为了延迟初始化,那么使用方法而不是静态类成员来构建单例是否有任何优势?

[英]If not for lazy initialisation, is there any advantage of building singleton using method rather than static class member?

我经常看到单例以这种方式构建:

public static MyClass instance() {
    if (singleton == null) {
        singleton = new MyClass();
    }
    return singleton;
}

如果不是出于延迟初始化的效果,那么这种方法是否比简单地声明一个静态实例具有任何优势?

public final static MyClass singleton = new MyClass();

不,实际上是另一种方法,即:

public final static MyClass singleton = new MyClass();

可能会更好,因为如果您有2个线程同时调用实例方法,则可能会获得竞争条件。

这是Java在实践中说做单例的方式:

  private final static MyClass _instance = new MyClass();

  public static MyClass getInstance() {
    return _instance;
  }

  private MyClass() {}

更新由于@ jon-skeet提到了它,Joshua Block撰写的有效Java一书中对Singleton的讨论非常好。 他指出的一件事是,如果您希望Singleton可序列化,则不能仅仅实现Serializable。 您还需要重写readResolve方法。 使用上述方法使此操作变得容易:

private Object readResolve() throws ObjectStreamException {
  return _instance;
}

更新2 :通过@mardavi链接查看关于Singletons的精彩讨论: http : //en.wikipedia.org/wiki/Singleton_pattern#Initialization_On_Demand_Holder_Idiom

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM