單例模式--靜態內部類和靜態程式碼塊實現單例的區別
阿新 • • 發佈:2018-12-26
靜態資源不是一開始就存在於記憶體中的。
我們來看一個例子,靜態資源不是一開始就存在於記憶體中的。
class A{
private A(){
System.out.println("A被初始化了");
}
private static A a = new A();
}
我們建立了一個類A,我們並沒有使用這個類,在控制檯,也不會輸出:“A初始化了”,這樣一句話。
靜態內部類和靜態程式碼塊實現單例的區別
靜態程式碼塊實現單例模式,事實上就是懶漢單例模式的變種。
public class T{
public static void main(String[] args) {
Singleton.print();
/*************/
Singleton2.print();
}
}
class Singleton{
private static Singleton instance;
private Singleton(){}
static{
System.out.println("Singleton--我在被呼叫的時候載入,而且只加載一次");
instance = new Singleton();
}
public static Singleton getInstance(){
return instance;
}
public static void print(){
System.out.println("我只想呼叫這個方法,不想初始化例項物件");
}
}
class Singleton2{
private Singleton2(){}
private static class Handler{
static{
System.out.println("Singleton2--我在呼叫的時候被載入,而且只加載一次" );
}
private static Singleton2 instance = new Singleton2();
}
public static Singleton2 getInstance(){
return Handler.instance;
}
public static void print(){
System.out.println("我只想呼叫這個方法,不想初始化例項物件");
}
}
輸出結果:
Singleton–我在被呼叫的時候載入,而且只加載一次
我只想呼叫這個方法,不想初始化例項物件
我只想呼叫這個方法,不想初始化例項物件
很明顯,這裡在不想初始化的時候,它初始化了,所以是一種變種的餓漢單例模式。