Public Class 具有相同的私有静态变量 class

Public Class with private static variable of same class

前几天查看一些 Java 代码,我看到了一些我以前从未见过的东西并且有点困惑。部分代码如下所示:

public class PreferredAlternateProxy {
    ...
    private static PreferredAlternateProxy instance;
    ...

    public static PreferredAlternateProxy getInstance(){
        if(instance == null)
            createInstance();

        return instance;
    }

    private static synchronized void createInstance(){
        if(instance == null)
            instance = new PreferredAlternateProxy();
    }
}

声明与 public class 相同 class 的静态 属性 的目的是什么?这在什么情况下有用?

使第二个方法 (createInstance()) 同步的目的是什么?

设计模式 之类的东西可以告诉您高效编写代码的方法。您给出的示例称为 Singleton。此模式的目的是创建 one 和唯一的 class 实例。它需要:

  1. 私有构造函数 - 任何人都无法创建 class.
  2. 的实例
  3. 私有静态字段 - 将生成的实例保存在内存中。
  4. Public 静态方法 - 即 "gatekeeper",其工作是 return 实例。

示例:

public class Singleton() {
    private static Singleton instance;

    private Singleton() {

    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

上面的例子叫做Lazy Initialization,因为直到你第一次调用getInstance()才会创建实例。

下面的示例显示了 早期初始化 ,它在 class 加载到内存中时立即创建实例。

public class Singleton() {
    private static Singleton instance = new Singleton();

    private Singleton() {

    }

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

您问题中的代码正在实现 Java 单例模式。

  • 您的示例中的 PreferredAlternateProxy 是静态创建 class level 变量,因为您只需要一个实例。
  • 添加了第二种方法,使其成为线程安全的,同时也降低了直接调用同步方法的开销。虽然我们只需要它用于可能创建单独实例的前几个线程。它被称为双重检查锁定原则。因此,如果创建了实例,那么您将不再调用同步方法。

希望这可以帮助您更好地理解它。

干杯!