单身设计模式实施

时间:2016-05-06 20:20:54

标签: java design-patterns singleton

我看到了Singleton Class的各种实现。但是,这个特定的实现:https://sourcemaking.com/design_patterns/singleton/java/1 不会在私有构造函数中创建对象。

有人可以解释一下,两种实现之间的优缺点是什么?给出的描述很少,我对它的了解不多。

感谢。

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 */ }
}