真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JAVA枚舉單例模式及源碼分析的實(shí)例詳解

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ì)本站的支持!


本文題目:JAVA枚舉單例模式及源碼分析的實(shí)例詳解
轉(zhuǎn)載注明:http://weahome.cn/article/jedoii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部