关于java:Singleton设计模式实现

Singleton Design Pattern Implementation

我看到了不同种类的singleton类实现。然而,这个特定的实现:https://sourcemaking.com/design_patterns/singleton/java/1不在私有构造函数中创建对象。

有人能解释一下,这两种实现之间的优缺点是什么吗?给出的描述是最小的,我对它了解不多。

谢谢。


你提供的链接很好地解释了这一点,如果简单地…但让我试着扩大…

The inner class is referenced no earlier (and therefore loaded no earlier by the class loader) than the moment that getInstance() is called.

这是解释中最重要的部分。

上述文本所指的内部类是SingletonHolder类,它的存在只是为了保存Singleton的一个实例。

因为这个类是私有的,不被引用到任何其他地方,所以保证这个类不会被初始化(由Java类加载器加载),直到EDOCX1的2个方法EDCOX1(1)被调用,因为这是最早的一个JVM来初始化该类。

当初始化一个类时,它包含的任何静态最终字段(和静态块)都将在该类对任何用户代码可用之前初始化。这种初始化是线程安全的,所以使用这种模式的代码不需要任何复杂的同步逻辑,您通常会在爪哇中的单模式模式中实现。

有关替代实现的更多讨论,包括基于enum的解决方案以及更复杂、显式同步的singleton版本,请参阅此问题。

请注意,如果您不关心使单例惰性加载(即仅在需要时初始化),那么只需使用最简单的方法:

1
2
3
4
class Singleton {
    public static final INSTANCE = new Singleton();
    private Singleton() { /* cannot be instantiated externally */ }
}