這是一個非常廣泛的傳播枚舉單碼:通過枚舉方式的單例是懶惰初始化的?
public enum enumClazz{
INSTANCE
enumClazz(){
//do something
}
}
和一堆地說,這是一個懶惰的初始化。
Java虛擬機規範給出實現的類和接口加載的時間 靈活性和鏈接, 但嚴格:一個類型的生命週期 - 但在我讀的「Inside the Java Virtual Machine」第7章我很困惑定義了初始化的時間。所有實現 必須初始化每個類或接口的第一次活動使用。所述 以下六個情況資格作爲活性的用途:
- 創建類的一個新實例(在字節碼,一個新的指令的執行可替換地,經由隱式的創建, 反射,克隆,或反序列化。)。
- 由類聲明的靜態方法的調用(在字節碼,一個invokestatic指令的執行)
- 通過一個類或接口中聲明的靜態域的使用或分配,除了靜態字段是最終並由 初始化一個編譯時常量表達式(在字節碼中S,A getstatic或putstatic指令)的執行
- 的Java API中的某些反射的方法,如在類類方法或類在java.lang.reflect中調用 包
- 初始化一類的子類的(一類的初始化需要其超類的現有的初始化。)
- 一類的指定爲初始類(與主()<法)時,Java虛擬機啓動
第三點粗體顯示,如果字段爲static final
,則該字段的初始化在編譯時發生。同樣,INSTANCE
的enumClazz
隱含地等於public static final
並符合第三點。
如果我的理解錯誤,有人能糾正我嗎? 「
類辛格爾頓{公共靜態最終instance = new Singleton(); ...}那麼,對於泛型類的方式,這個「實例」是否被惰性初始化? –
是的,它會以相同的方式懶惰地初始化。 – assylias
全部清除。感謝一堆:) –