让我们以通常的单身人士为例。
public class Single1 {
private static final Single1 INSTANCE = new Single1();
private Single1() {
System.out.println("Single1 - Constructor");
}
public static Single1 getInstance(){
System.out.println("Single1.getInstance");
return INSTANCE;
}
}
在构造函数中,我们将输出到 System.out。程序运行时,可以看到第一次调用getInstance时调用了构造函数!但是,这个单例被认为是非惰性的,并且在加载类时立即初始化。问题:我做错了什么?
这不是关于第一次调用
getInstance(),而是关于类的第一次调用Single1。如果您创建除 之外的另一个静态方法
getInstance(),它只是将一个字符串打印到屏幕上,您还将看到初始化INSTANCE。惰性单例正是在直接需要实例时初始化的单例(即,当调用 exactly
getInstance(),而不是另一个类方法时)。这个实现不满足已经说过的,因此它不是一个懒惰的单例)。在 Java 中,类本身也是对象,该类的实例也是。它们仅在代码中使用该类时创建 - 在每个加载程序的单个实例中。任何静态都是指类本身,而不是实例。因此,所有静态初始化都会在创建类对象的那一刻发生,而不是在第一次访问实例对象时发生。