JAVA 枚舉單例模式及源碼分析的實例詳解
JAVA 枚舉單例模式及源碼分析的實例詳解
單例模式的實現(xiàn)有很多種,網(wǎng)上也分析了如今實現(xiàn)單利模式最好用枚舉,好處不外乎三點:
1.線程安全
2.不會因為序列化而產(chǎn)生新實例
3.防止反射攻擊但是貌似沒有一篇文章解釋ENUM單例如何實現(xiàn)了上述三點,請高手解釋一下這三點:
關(guān)于第一點線程安全,從反編譯后的類源碼中可以看出也是通過類加載機(jī)制保證的,應(yīng)該是這樣吧(解決)
關(guān)于第二點序列化問題,有一篇文章說枚舉類自己實現(xiàn)了readResolve()方法,所以抗序列化,這個方法是當(dāng)前類自己實現(xiàn)的(解決)
關(guān)于第三點反射攻擊,我有自己試著反射攻擊了以下,不過報錯了...看了下方的反編譯類源碼,明白了,因為單例類的修飾是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 枚舉單例模式及源碼分析,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
深入解析Java多態(tài)進(jìn)階學(xué)習(xí)
java的動態(tài)綁定機(jī)制非常重要。這篇文章將帶大家更深入的學(xué)習(xí)一下Java的多態(tài),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下2022-07-07基于Java隨機(jī)生成手機(jī)短信驗證碼的實例代碼
這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗證碼的實例代碼,代碼分為哦簡單版和復(fù)雜版,需要的朋友可以參考下2019-04-04SpringBoot優(yōu)化接口響應(yīng)時間的九個技巧
在實際開發(fā)中,提升接口響應(yīng)速度是一件挺重要的事,特別是在面臨大量用戶請求的時候,本文為大家整理了9個SpringBoot優(yōu)化接口響應(yīng)時間的技巧,希望對大家有所幫助2024-01-01關(guān)于mybatis resulttype 返回值異常的問題
這篇文章主要介紹了mybatis resulttype 返回值異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08