這篇文章主要介紹了JAVA 枚舉單例模式及源碼分析的實例詳解的相關資料,需要的朋友可以參考下
JAVA 枚舉單例模式及源碼分析的實例詳解
單例模式的實作有很多種,網路上也分析現今實現單利模式最好用枚舉,好處不外乎三點:
1.線程安全
2.不會因為序列化而產生新實例
3.防止反射攻擊但是貌似沒有一篇文章解釋ENUM單例如何實現了上述三點,請高手解釋一下這三點:
關於第一點執行緒安全,從反編譯後的類別原始碼中可以看出也是透過類別載入機制保證的,應該是這樣吧(解決)
關於第二點序列化問題,有一篇文章說枚舉類別自己實現了readResolve()方法,所以抗序列化,這個方法是當前類別自己實現的(解決)
關於第三點反射攻擊,我有自己試著反射攻擊了以下,不過報錯了...看了下方的反編譯類源碼,明白了,因為單例類的修飾是abstract的,所以沒法實例化。 (解決)
以下是我寫的一個枚舉單例,以及其class檔案反編譯過後的類別
枚舉單例
public enum Singleton { INSTANCE { @Override protected void read() { System.out.println("read"); } @Override protected void write() { System.out.println("write"); } }; protected abstract void read(); protected abstract void write(); }
反編譯過後還原的類別
public abstract class Singleton extends Enum { private Singleton(String s, int i) { super(s, i); } protected abstract void read(); protected abstract void write(); public static Singleton[] values() { Singleton asingleton[]; int i; Singleton asingleton1[]; System.arraycopy(asingleton = ENUM$VALUES, 0, asingleton1 = new Singleton[i = asingleton.length], 0, i); return asingleton1; } public static Singleton valueOf(String s) { return (Singleton)Enum.valueOf(singleton/Singleton, s); } Singleton(String s, int i, Singleton singleton) { this(s, i); } public static final Singleton INSTANCE; private static final Singleton ENUM$VALUES[]; static { INSTANCE = new Singleton("INSTANCE", 0) { protected void read() { System.out.println("read"); } protected void write() { System.out.println("write"); } }; ENUM$VALUES = (new Singleton[] { INSTANCE }); } }
以上是Java中關於枚舉單例模式與原始碼分析的範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!