1. 程式人生 > >單例模式--靜態內部類和靜態程式碼塊實現單例的區別

單例模式--靜態內部類和靜態程式碼塊實現單例的區別

靜態資源不是一開始就存在於記憶體中的。

我們來看一個例子,靜態資源不是一開始就存在於記憶體中的。

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–我在被呼叫的時候載入,而且只加載一次
我只想呼叫這個方法,不想初始化例項物件
我只想呼叫這個方法,不想初始化例項物件

  • 很明顯,這裡在不想初始化的時候,它初始化了,所以是一種變種的餓漢單例模式。