2014-05-17 205 views
4

的渴望實例我有一個Singleton辛格爾頓

public class Singleton 
{ 
    private static Singleton instance = new Singleton(); 

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

    public static Singleton getInstance() 
    { 
     return instance; 
    } 
} 

我可以運行此代碼,但沒有被創建的實例,除非getInstance()被調用。這很奇怪,因爲我使用急切實例化,所以構造函數中的println()應該執行。

有人可以解釋一下嗎?

+0

那麼,你需要一種方法來首先執行該構造函數。這是與'getInstance' –

+0

該類不會被初始化,直到「第一(嘟嘟)參考」。簡單地加載類不會初始化它,但是(除其他之外)調用類的靜態方法。 –

+0

這個規定很清楚是什麼原因導致類的初始化:http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html#jvms-5.5 –

回答

5

實例將沒有生成,直到類將被裝載的第一次,如果你想急於初始化,而不必調用getInstance()方法,你可以調用

Class.forName(Singleton.class.getName()); 

在初始化

你有實例作爲靜態字段,靜態字段被初始化的類加載事件,所以如果你想急於初始化一旦類在代碼中的某處訪問您只需加載類熱切

+0

能否請您解釋一下? –

+0

所以實質上,只有在需要時纔會創建實例?有點像懶惰的實例化吧?除非我用'的Class.forName(Singleton.class);' – user3648439

+0

@user看到UDPATE –

2

,所有的靜態變量相關的無線網絡它被加載並賦值。

如果程序中第一個使用類的地方是你調用getInstance()的地方,那麼該類將被加載,靜態變量將被初始化,並且構造函數將被運行。