【发布时间】:2013-09-28 15:20:41
【问题描述】:
我不太清楚 Singleton 类的早期初始化一词是什么意思。了解单例类的生命周期也会有所帮助。
【问题讨论】:
我不太清楚 Singleton 类的早期初始化一词是什么意思。了解单例类的生命周期也会有所帮助。
【问题讨论】:
Lazy initialization 的意思是你在第一次使用对象之前不会初始化它们。
Early initialization 正好相反,你在加载类时预先初始化一个单例。
有一些方法可以进行早期初始化,一种是将你的单例声明为static。
以下为例:
public class SingletonClassEarly {
private static SingletonClassEarly sce = new SingletonClassEarly();
private SingletonClassEarly() {} // make it private
public static SingletonClassEarly getInstance() {
return sce;
}
}
根据生命周期,这个单例是在 JVM 启动和类初始化之后加载的。它在关闭/退出时被 JVM 卸载。
【讨论】:
Enum 是另一种方式,或者使用像 Spring 这样的框架注入单例。
延迟初始化
class SingletonClass {
private static SingletonClass object;
private SingletonClass () {}
public static SingletonClass getInstance(){
if(object == null){
object= new SingletonClass (); //Lazy Initalizaion
}
return object;
}
}
早期初始化
class SingletonClass {
private static SingletonClass object = new SingletonClass (); //Early initialization
private SingletonClass () {}
public static SingletonClass getInstance(){
return object;
}
}
【讨论】:
通常在单例中,这就是你所看到的
private static YouClass singleTon ;
--
--
public static YouClass getInstance(){
if(singleTon == null){
singleTon = new YouClass();
}
return singleTon ;
}
在这种情况下,当您第一次调用 getInstance() 时,只会创建 YouClass 实例。
早期初始化,也就是说
在你的课堂上
private static YouClass singleTon = new YouClass();
在声明自己的同时创建实例。
来自Singleton pattern wiki ,读取类型,
延迟初始化
渴望初始化
静态块初始化
【讨论】:
感谢大家的解释。这有助于回答我的问题。
我还发现了一些有用的博客文章,其中更详细地介绍了不同方法的工作原理。
以下是链接:
http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/
下一篇文章帮助解释使用双重检查方法时 volatile 关键字的使用:
http://javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html
【讨论】: