基本上,这是懒惰的问题。这是懒在直到类初始化它不会构建单,但它是在渴望有 可能 是情况下,您要使用的类没有初始化的单身本身。
例如:
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方法,在这种情况下,它们是等效的(例如,假设您不使用反射以某种方式初始化类型)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)