我看到了Singleton Class的各种实现。但是,这个特定的实现:https://sourcemaking.com/design_patterns/singleton/java/1 不会在私有构造函数中创建对象。
有人可以解释一下,两种实现之间的优缺点是什么?给出的描述很少,我对它的了解不多。
感谢。
答案 0 :(得分:2)
您提供的链接非常清楚地说明了这一点......但是让我尝试扩展......
与调用getInstance()的那一刻相比,内部类没有被引用(因此不会被类加载器加载)。
这是解释中最重要的部分。
上述文本所指的内部类是SingletonHolder
类,它仅用于保存Singleton
的实例。
因为此类是私有的而不是在其他任何地方引用,所以可以保证在调用getInstance()
Singleton
方法之前不会初始化此类(由Java ClassLoader加载),因为这是初始化该类所需的最早JVM。
初始化类时,在类可用于任何用户代码之前,初始化它包含的任何静态最终字段(和静态块)。这种初始化是线程安全的,因此使用这种模式的代码不需要在Java中的单例模式的其他实现中通常会找到的任何复杂的同步逻辑。
有关替代实施的更多讨论,请参阅this question,包括基于enum
的解决方案以及更复杂,明确同步的Singleton版本。
请注意,如果你不关心使你的单例延迟加载(即只在需要时进行初始化),那么只需使用最简单的方法:
class Singleton {
public static final INSTANCE = new Singleton();
private Singleton() { /* cannot be instantiated externally */ }
}