基本上,这是懒惰的问题。这是懒在直到类初始化它不会构建单,但它是在渴望有 可能 是情况下,您要使用的类没有初始化的单身本身。
例如:
public final class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
public static void sayHello() {
System.out.println("Hello!");
}
}
调用Singleton.sayHello()
将实例化单例,即使我们不希望它…也因此没有那么懒。
您可以使用嵌套类型来解决此问题:
public final class Singleton {
private Singleton() {}
public static Singleton getInstance() {
return Holder.instance;
}
public static void sayHello() {
System.out.println("Hello!");
}
private static class Holder {
private static final Singleton instance = new Singleton();
}
}
现在Singleton.Holder
将仅通过使用getInstance
方法进行初始化。它是惰性的并且是线程安全的,没有锁定。
以我的经验,通常单例类的 唯一 静态方法是getInstance
方法,在这种情况下,它们是等效的(例如,假设您不使用反射以某种方式初始化类型)。