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