JAVA 枚舉單例模式及源碼分析的實(shí)例詳解
成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供霍邱網(wǎng)站建設(shè)、霍邱做網(wǎng)站、霍邱網(wǎng)站設(shè)計(jì)、霍邱網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、霍邱企業(yè)網(wǎng)站模板建站服務(wù),10余年霍邱做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
單例模式的實(shí)現(xiàn)有很多種,網(wǎng)上也分析了如今實(shí)現(xiàn)單利模式最好用枚舉,好處不外乎三點(diǎn):
1.線程安全
2.不會(huì)因?yàn)樾蛄谢a(chǎn)生新實(shí)例
3.防止反射攻擊但是貌似沒(méi)有一篇文章解釋ENUM單例如何實(shí)現(xiàn)了上述三點(diǎn),請(qǐng)高手解釋一下這三點(diǎn):
關(guān)于第一點(diǎn)線程安全,從反編譯后的類(lèi)源碼中可以看出也是通過(guò)類(lèi)加載機(jī)制保證的,應(yīng)該是這樣吧(解決)
關(guān)于第二點(diǎn)序列化問(wèn)題,有一篇文章說(shuō)枚舉類(lèi)自己實(shí)現(xiàn)了readResolve()方法,所以抗序列化,這個(gè)方法是當(dāng)前類(lèi)自己實(shí)現(xiàn)的(解決)
關(guān)于第三點(diǎn)反射攻擊,我有自己試著反射攻擊了以下,不過(guò)報(bào)錯(cuò)了...看了下方的反編譯類(lèi)源碼,明白了,因?yàn)閱卫?lèi)的修飾是abstract的,所以沒(méi)法實(shí)例化。(解決)
以下是我寫(xiě)的一個(gè)枚舉單例,以及其class文件反編譯過(guò)后的類(lèi)
枚舉單例
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ò)后還原的類(lèi)
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ì)本站的支持!