什么时候我应该使用懒惰的单身人士而不是普通的单身人士?

时间:2018-01-27 00:02:11

标签: java single-instance

到目前为止,我已经看到了两个单身人士的例子。

普通单身人士,

public class Singleton {
  private static Singleton instance;

  static {
    instance = new Singleton();
  }

  private Singleton() { 
    // hidden constructor
  }    

  public static Singleton getInstance() {
    return instance;
  }
}

和Lazy Singletons,

public class Singleton {

  private Singleton() { 
    // hidden constructor
  }

  private static class Holder {
    static final Singleton INSTANCE = new Singleton();
  }

  public static Singleton getInstance() {
    return Holder.INSTANCE;
  }
}

编码来自this线程和this用户。我刚刚开始尝试学习单身人士,因为我以前的方法已经

1。)使用静态来创建像......

static MyClass instance;

2。)我会尝试以一种看似奇怪的方式传递一个实例,

MyClass instance;

@Override
public void onEnable() { instance = this; }

// Transition to different class - - -

public OtherClass(MyClass myClass) {
    this.instance = myClass;
}

最后,我的最终目标是什么?我主要使用它来将变量从我的主类传递给其他类。我目前正在尝试学习如何正确使用FileFileConfiguration,因此我希望在我的课程中轻松分享它们。

如果我看起来像是一个初学者,请提供一个资源来帮助我解决我的问题,而不是一路走来告诉我学习Java。

2 个答案:

答案 0 :(得分:1)

This link解释得相当好,甚至使用了类似的例子。

  

在软件工程中,按需初始化持有者(设计模式)习语是一个懒惰的单例。在所有版本的Java中,这个习惯用法都能实现安全,高度并发的延迟初始化,并具有良好的性能。

关于为什么,你应该使用它:如果这个实例的创建很昂贵,那么这个设计模式基本上代表了需要时的昂贵计算,而不是外部类{{ 1}}在你的情况下,首先被访问。

this other link给出了另一个原因。它声明:

  

单例实现可以使用延迟初始化,其中在首次调用静态方法时创建实例。如果可以同时从多个线程调用静态方法,则可能需要采取措施来防止可能导致创建该类的多个实例的竞争条件。

答案 1 :(得分:0)

至于何时,而不是如何:当有可能不需要对象时,我将使用单例或任何其他对象的延迟实例化,当需要它的可能性很高时立即实例化。通常,如果实例化失败,并且需要该对象,则最好尽早失败。