JDK 5 引入的 enum 關鍵字定義了一種類型安全的枚舉類別。它本質上是一個特殊的 class,繼承自 java.lang.Enum,具有以下核心特徵:
private 或 package-private,確保客戶端程式碼無法透過 new 建立實例。public static final:所有枚舉值(如 Color.RED)都是編譯期常數。Comparable 介面:依宣告順序比較,ordinal() 返回索引(從 0 開始)。toString():預設返回枚舉常數名稱(如 "RED")。valueOf(String) 靜態方法:根據名稱返回對應枚舉常數,與 toString() 互逆。values() 靜態方法:返回所有枚舉常數陣列,依宣告順序,便於遍歷。public enum Color {
RED, GREEN, BLUE
}
for (Color c : Color.values()) {
System.out.println("find value: " + c); // 輸出: RED, GREEN, BLUE
}
public enum Color {
RED, GREEN, BLUE;
private static final int COUNT = Color.values().length;
public static Color getRandomColor() {
int idx = (int) (System.currentTimeMillis() % COUNT);
return Color.values()[idx];
}
}
// 注意:變數/方法定義必須在所有枚舉常數**之後**,否則編譯錯誤。
toString() 與 valueOf()public enum Color {
RED, GREEN, BLUE;
@Override
public String toString() {
switch (this) {
case RED: return "Color.RED";
case GREEN: return "Color.GREEN";
case BLUE: return "Color.BLUE";
default: return "Unknown Color";
}
}
// 若覆寫 toString(),建議同步覆寫 valueOf() 保持一致性(需自行實作邏輯)。
}
覆寫後遍歷輸出:Color.RED、Color.GREEN、Color.BLUE。
public enum Color {
RED("紅色"), GREEN("綠色"), BLUE("藍色");
private final String desc;
Color(String desc) { this.desc = desc; }
public String getDesc() { return desc; }
}
// 使用:
Color.RED.getDesc(); // "紅色"
建構子必須是 private,確保外部無法實例化。每個枚舉常數對應一個單例物件,建構子在類別載入時自動被呼叫一次。
public interface Drawable { void draw(); }
public enum Shape implements Drawable {
CIRCLE { public void draw() { System.out.println("畫圓"); } },
RECTANGLE { public void draw() { System.out.println("畫矩形"); } }
}
public enum Color {
RED { @Override public String toString() { return "Color.RED"; } },
GREEN { @Override public String toString() { return "Color.GREEN"; } },
BLUE { @Override public String toString() { return "Color.BLUE"; } };
}
// 每個常數都是 Color 的匿名子類別,邏輯更內聚。
java.lang.Enum),但可實作多個介面。final),枚舉類別不能有子類別。enum Singleton { INSTANCE; } 天然防序列化破壞、執行緒安全、簡潔。if/else 或 switch。== 比較成立),無需實作 readResolve()。| 方法 | 說明 |
|---|---|
values() | 返回所有枚舉常數陣列(靜態,編譯器自動生成) |
valueOf(name) | 根據名稱返回常數,找不到拋 IllegalArgumentException(靜態) |
ordinal() | 返回宣告順序索引(0-based) |
name() | 返回常數名稱(final,不可覆寫) |
toString() | 預設返回 name(),可覆寫 |
compareTo(o) | 比較宣告順序(實作 Comparable) |
getDeclaringClass() | 返回此枚舉類型的 Class 物件 |
JDK 5 的 enum 遠不止「列舉常數」的語法糖,它是一個功能完整的類別,支援欄位、方法、介面實作、甚至每個常數擁有專屬行為。善用 Enum 可大幅提升程式碼的**型別安全性、可讀性、可維護性**,是現代 Java 開發中不可或缺的利器。記住核心原則:**用對地方、保持簡單、發揮型別安全優勢**。