餓漢式單例模式與靜態內部類實現的懶漢式單例模式


餓漢式單例模式

public class Singleton {  
    private Singleton() {}  
    private static final Singleton single = new Singleton();  
    //靜態工廠方法   
    public static Singleton getInstance() {  
        return single;  
    }  
}

靜態內部類實現的懶漢式單例模式

public class Singleton {    
    private static class LazyHolder {    
       private static final Singleton INSTANCE = new Singleton();    
    }    
    private Singleton (){}    
    public static final Singleton getInstance() {    
       return LazyHolder.INSTANCE;    
    }    
}    

第一種方式是餓漢式單例模式,比較容易理解的,即類在加載后就實例化了。

第二種方式是懶漢式單例模式,且使用了靜態內部類實現。可能很多人一開始看到的時候會覺得,使用這種方式的單例模式也是在類加載后就實例化了,其實不然,如果我們在以上兩種單例模式的構造器中隨意加入一行打印字符串的代碼,然后加載一下以上兩個類就會發現區別。

例如:都將構造器改為

private Singleton(){
    System.out.println("init");
}

添加測試使用的main方法

public static void main(String[] args) {
    Singleton s = getInstance();
}

使用debug模式,在Singleton s = getInstance();一行處打上斷點,並執行main方法。由於打了斷點,所以執行main方法后會在執行Singleton s = getInstance();前停止,但此時第一種方式的單例模式打印出了“init”字樣,而第二種方式單例模式並未打印,直到執行Singleton s = getInstance();一行代碼后才打印“init”字樣。也就說明了第一種是餓漢式,第二種是懶漢式。

 

關於使用靜態內部類實現的單例模式為什么是懶漢式的,其實和靜態內部類有關。

 

內部類分為對象級別(非靜態內部類)和類級別(靜態內部類),類級內部類指的是,有static修飾的成員變量的內部類。如果沒有static修飾的成員變量的內部類被稱為對象級內部類。

類級內部類相當於其外部類的static成員,它的對象與外部類對象間不存在依賴關系,相互獨立,因此可直接創建。而對象級內部類的實例,是必須綁定在外部對象實例上的。

類級內部類只有在第一次被使用的時候才被會裝載。

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM