我有这样的代码:
class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
System.out.println("Singleton constructed.");
}
public static Singleton getInstance() {
return INSTANCE;
}
}
当我们没有任何其他静态方法 getInstance 时,这个单例是否会延迟初始化?据我所知,类仅在某些情况下才会初始化,例如:
- 类的实例是使用 new() 关键字或使用 使用 class.forName() 进行反射,这可能会抛出 Java 中的 ClassNotFoundException。
- 调用类的静态方法。
- 分配了 Class 的静态字段。
- 使用类的静态字段,它不是常量变量。
- 如果 Class 是顶级类,并且执行词法嵌套在类中的断言语句。
因此,当唯一的静态方法是 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/