我看到了Singleton类的不同实现。但是,此特定实现:https://sourcemaking.com/design_patterns/singleton/java/1 不会在私有构造函数中创建对象。单例设计模式实现
有人可以解释,两种实现之间的优点或缺点是什么?给出的描述是最小的,我没有从中理解很多。
谢谢。
我看到了Singleton类的不同实现。但是,此特定实现:https://sourcemaking.com/design_patterns/singleton/java/1 不会在私有构造函数中创建对象。单例设计模式实现
有人可以解释,两种实现之间的优点或缺点是什么?给出的描述是最小的,我没有从中理解很多。
谢谢。
您所提供的链接解释得很好,如果简洁......但让我尝试展开......
内部类不早引用(因此没有加载较早类加载器)比getInstance()被调用的时刻。
这是解释中最重要的部分。
上述文字所指的内部类是SingletonHolder
类,该类仅用于保存Singleton
的实例。
因为这个类是私人的,没有提到其他地方,这是保证这个类不会被初始化(由Java类加载器加载),直到Singleton
的getInstance()
方法被调用,因为这是需要JVM最早初始化该类。
当一个类被初始化时,它所包含的任何静态final字段(和静态块)都会在类可用于任何用户代码之前被初始化。这种初始化是线程安全的,所以使用这种模式的代码不需要任何复杂的同步逻辑,这些逻辑通常会在Java的单例模式的其他实现中找到。
请参阅this question了解更多关于替代实现的讨论,包括基于enum
的解决方案以及更复杂,明确同步的Singleton版本。
请注意,如果你不担心你的单身懒加载(即只在需要时初始化),那么就使用最简单的方式:
class Singleton {
public static final INSTANCE = new Singleton();
private Singleton() { /* cannot be instantiated externally */ }
}
单例类之间[差异可能的复制和静态类?](http://stackoverflow.com/questions/3714971/difference-between-singleton-class-and-static-class) – sinclair
看看:http://javarevisited.blogspot.de/2013/ 03 /差之间-单例模式-VS-静态类java.html – sinclair