java - 这是单例延迟初始化吗?

标签 java singleton lazy-initialization

我有这样的代码:

class Singleton {

    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {
        System.out.println("Singleton constructed.");
    }

    public static Singleton getInstance() {
        return INSTANCE;
    }

}

当我们没有任何其他静态方法 getInstance 时,这个单例是否会延迟初始化?据我所知,类仅在某些情况下才会初始化,例如:

  1. 类的实例是使用 new() 关键字或使用 使用 class.forName() 进行反射,这可能会抛出 Java 中的 ClassNotFoundException。
  2. 调用类的静态方法。
  3. 分配了 Class 的静态字段。
  4. 使用类的静态字段,它不是常量变量。
  5. 如果 Class 是顶级类,并且执行词法嵌套在类中的断言语句。

(来源:http://javarevisited.blogspot.com/2012/07/when-class-loading-initialization-java-example.html#ixzz4IjIe2Rf5)

因此,当唯一的静态方法是 getInstance 并且构造函数是私有(private)的时,除了使用 getInstance 方法(反射除外)之外,不可能以任何其他方式初始化 Singleton 类。所以该对象仅在我们需要时才创建,因此这是一个延迟初始化,对吧?或者也许我错过了什么?

最佳答案

您提到了静态方法和私有(private)构造函数。添加另一个静态字段,例如:

static int NUMBER = 13;

在你的 Singleton 类中。并在其他类的main方法中:

System.out.println(Singleton.NUMBER);

然后,您将看到您的 Singleton 没有延迟初始化。

但是,当您的字段是静态的 FINAL 时:

static final int NUMBER = 13;

单例是延迟初始化的。

此外,当您在 Singleton 类中添加静态和非静态初始化 block 时:

{
    System.out.println("non-static");
}

static {
    System.out.println("static");
}

顺序是:非静态、私有(private)构造函数,然后是静态,因为您将对象实例化为静态字段的值。所以,这是非常棘手的:)

总之,在某些情况下,您的单例可能会被视为延迟初始化,但通常情况并非如此。

关于java - 这是单例延迟初始化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39208366/

相关文章:

java - Firestore - 如何从 DocumentSnapshot 中获取集合?

java - 我们在 Spring 中使用 Prototype 范围的实际业务场景?

Java:来自基类的单例

c++ - 有没有办法在 C++ 中延迟初始化成员变量(类)?

Hibernate jpa 实体管理器未在 Spring 服务层中关闭

java - 在 Spring Tool Suite 中使用 Ant 时出现运行 javac.exe 编译器错误消息

java - 使用 REST API 创建新站点

java - 有没有一种方法可以将复杂的 JSON 转换为对象而不创建 POJO?

c++ - 在运行时反复使用和对象的最佳实践是什么

swift - 有没有办法判断惰性变量是否已初始化?