2016-05-06 104 views
0

我看到了Singleton类的不同实现。但是,此特定实现:https://sourcemaking.com/design_patterns/singleton/java/1 不会在私有构造函数中创建对象。单例设计模式实现

有人可以解释,两种实现之间的优点或缺点是什么?给出的描述是最小的,我没有从中理解很多。

谢谢。

+0

单例类之间[差异可能的复制和静态类?](http://stackoverflow.com/questions/3714971/difference-between-singleton-class-and-static-class) – sinclair

+1

看看:http://javarevisited.blogspot.de/2013/ 03 /差之间-单例模式-VS-静态类java.html – sinclair

回答

2

您所提供的链接解释得很好,如果简洁......但让我尝试展开......

内部类不早引用(因此没有加载较早类加载器)比getInstance()被调用的时刻。

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

上述文字所指的内部类是SingletonHolder类,该类仅用于保存Singleton的实例。

因为这个类是私人的,没有提到其他地方,这是保证这个类不会被初始化(由Java类加载器加载),直到SingletongetInstance()方法被调用,因为这是需要JVM最早初始化该类。

当一个类被初始化时,它所包含的任何静态final字段(和静态块)都会在类可用于任何用户代码之前被初始化。这种初始化是线程安全的,所以使用这种模式的代码不需要任何复杂的同步逻辑,这些逻辑通常会在Java的单例模式的其他实现中找到。

请参阅this question了解更多关于替代实现的讨论,包括基于enum的解决方案以及更复杂,明确同步的Singleton版本。

请注意,如果你不担心你的单身懒加载(即只在需要时初始化),那么就使用最简单的方式:

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