Java枚舉類的高級用法說明


public enum Color{
    RED, BLUE, BLACK, YELLOW, GREEN
}
Color c = Color.RED;

如上,是我們通常使用枚舉類型的常用方式。

從編寫方式上看,enum很像是特殊的class,實際上enum聲明定義的類型就是一個類。而這些類都是類庫中Enum類的子類。查看編譯之后的字節碼文件可以發現enum類型被單獨編譯成了字節碼文件Color.class。

Compiled from "Color.java"
public final class Color extends java.lang.Enum<Color> {
  public static final Color RED;
  public static final Color BLUE;
  public static final Color BLACK;
  public static final Color YELLOW;
  public static final Color GREEN;
  public static Color[] values();
  public static Color valueOf(java.lang.String);
  static {};
}

由上可知:

1. enum類型是一個不可以被繼承的final類。其枚舉值都是Color類型的類靜態常量(這也是為什么enum會大寫的原因)。

2. 既然是類,所以enum類型也有構造函數,方法和域。不過enum類型與一般class有很大的不同:

(1)構造函數只會在構造枚舉值的時候被調用

enum Color{
    RED(255, 0, 0), BLUE(0, 255, 0), GREEN(0, 0, 255);//注意此處必須有分號

    private Color(int r, int g, int b){
        this.r = r;
        this.g = g;
        this.b = b;
    }        

    private int r, g, b;

    public String toString(){
        return super.toString() + "(" + r + ", " + g + ", " + b + ")";
    }  
}

(2) 為了確保構造函數不會被外部調用,因此構造函數必須是private的。

(3) 所有enum類型都會繼承Enum.java的方法,包括:

     a. ordinal()方法:返回枚舉值在enum類中的順序。這個順序依據枚舉值聲明時的順序而定。

    Color.RED.oridinal(); //返回結果:0

  b. compareTo()方法:

    Color.RED.compareTo(Color.BLUE); //返回結果:-1

  c. toString():返回枚舉值的名稱

    Color.RED.toString(); //返回結果:RED

  d. values():返回一個包含全部枚舉值的數組

    Color[] colors = Color.values();

  e. valueOf():返回枚舉值常量

    Color.valueOf("BLUE"); //返回結果:Color.BLUE

  d. equals() : 比較兩個枚舉類對象的引用。

  

public final boolean equals(Object other){
    return this == other;  
}

 注意:枚舉類和枚舉值的不同

 

如上,這樣我們知道了枚舉值帶方法和變量時的原理和用法。因此enum還有一個用法是實現接口。

public enum Color implements IColor{
    RED("紅色", 1), GREEN("綠色", 2), BLUE("藍色", 3);

    private Color(String name, int value){
      this.name =  name;
      this.value = value;
    }

    private String name;
    private int value;

    @Override
    public String getName(){
        return this.name;
    }

    @Override
    public int getValue(){
        return this.value;
    }
}

需要注意的是,哪些方法是給枚舉類調用的,哪些方法是給枚舉值調用的。

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM