enum 是 JDK 5.0 引入的特殊參考型別,關鍵字 enum 定義的類別隱含 final,直接繼承 java.lang.Enum,不可被繼承。列舉值為 public static final 常數,即該列舉類別的單例實例。
public enum Color { RED, BLUE, BLACK, YELLOW, GREEN }
編譯產生 Color.class,反編譯可見:
public static final Color RED; 等靜態常數Color(String name, int ordinal),外部無法實例化values()、valueOf(String) 等方法private,僅在靜態初始化時由編譯器調用,保證實例固定。enum Color {
RED(255,0,0), BLUE(0,0,255), BLACK(0,0,0), YELLOW(255,255,0), GREEN(0,255,0);
private int r, g, b;
private Color(int r, int g, int b) { this.r=r; this.g=g; this.b=b; }
public String toString() { return super.toString() + "(" + r + "," + g + "," + b + ")"; }
public int getR() { return r; } // getter...
}
使用:Color c = Color.RED; System.out.println(c); // RED(255,0,0)
| 方法 | 說明 | 範例 |
|---|---|---|
ordinal() | 宣告順序索引(0-based) | Color.RED.ordinal() → 0 |
compareTo(E o) | 比較順序差(實作 Comparable) | Color.RED.compareTo(Color.BLUE) → -1 |
values() | 靜態,回傳所有列舉值陣列 | for(Color c: Color.values()) ... |
toString() | 回傳列舉常數名稱 | Color.RED.toString() → "RED" |
valueOf(String) | 靜態,名稱轉列舉值 | Color.valueOf("BLUE") → Color.BLUE |
equals(Object) | 參考比較(final,不可覆寫) | c1 == c2 等價 |
Color c = Color.RED;
switch (c) {
case RED: System.out.println("紅色"); break;
case BLUE: System.out.println("藍色"); break;
// 無需寫 Color.RED,編譯器自動推斷
}
int 常數,獲得型別安全、命名空間、IDE 補全、Switch 完整性檢查。列舉是 Java 型別系統中表達「固定實例集合」的最佳工具,善用之可大幅提升代碼清晰度與安全性。