Enum與最佳単例設計

1 枚舉基礎html

自定義一個枚舉類很簡單, 不過類型關鍵字是 enum, 不是 class, 也不是 interface.
public enum Action {
  UP, DOWN, LEFT, RIGHT
}java

自定義的 Action枚舉 本質上仍是一個 class, 反編譯能夠看到以下定義:
public final class Action extends Enum {...}安全

enum關鍵字 定義了特殊的類, 繼承 java.lang.Enum, 由編譯程序處理, 咱們直接寫類繼承 Enum類 會被編譯程序拒絕. 有必要了解下 java.lang.Enum類.函數

Enum 是個抽象類, 沒法直接實例化.
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
  private final String name;
  private final int ordinal;
  protected Enum(String name, int ordinal) {
    this.name = name;
    this.ordinal = ordinal;
  }
...
}
咱們定義的 Action, 會繼承這個 Enum, 而且四個枚舉成員都將成爲 static final 的 Action實例:
private Action(String s, int i){
  super(s, i);
}
public static final Action UP; //其餘成員略
static{
  UP = new Action("UP", 0);
}學習

能夠看出, Enum 的 name 記錄了枚舉成員的字符串名稱, ordinal 則記錄了枚舉成員的加入順序, Enum成員的排序和switch語法, 都是利用了 ordinal() 取得 int 值.
ordinal 的值是枚舉成員定義的順序(由0開始), 若是不想要這個順序, 能夠加入 int 字段來主動編號:this

  DOWN(2), UP(1), RIGHT(4), LEFT(3);
  private int number;
  private Action(int number){
    this.number = number;
  }spa

值得注意的是, 咱們向上面這樣加入實例變量, 重寫私有構造, 最後都會編譯程序做爲產生真的構造函數參考之用, 實際反編譯會變成這樣:
private Action(String s, int i, int number){
  super(s, i);
  this.number = number;
}
public static final DOWN; //其餘成員略
...
static{
  DOWN = new Action("DOWN", 0, 2);
  ...
}
......線程

枚舉成員, 在 JVM 中只會存在單一實例. //static final設計

--------------------------------------------------------------------------------
2 最佳単例設計htm

枚舉類的特色, 決定了其在單例設計使用上的自然優點.
Joshua Bloch大神說過: 單元素的枚舉類型已經成爲實現Singleton的最佳方法.
 public enum EnumSingleton {
  INSTANCE;
  public EnumSingleton getInstance(){
    return INSTANCE;
  }
 }

優勢:
寫法簡單優雅; 線程安全; 可應對反射攻擊; 序列化支持..
缺點:
由於已經繼承了 Enum, 因此不能再繼承了.

參考:
<<JDK7學習筆記>>林信良
http://www.importnew.com/24272.html
http://www.runoob.com/design-pattern/singleton-pattern.html
http://www.cnblogs.com/chiclee/p/9097772.html
https://www.cnblogs.com/lanxuezaipiao/p/3369962.html

相關文章
相關標籤/搜索