首頁  >  文章  >  Java  >  Java中關於枚舉單例模式與原始碼分析的範例

Java中關於枚舉單例模式與原始碼分析的範例

黄舟
黄舟原創
2017-08-08 09:57:041458瀏覽

這篇文章主要介紹了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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn