J2SE 5.0 枚舉不僅是常數集合,每個枚舉值還可擁有專屬的類別主體,實現針對特定常數的行為差異——本質上是為每個枚舉值生成匿名內部子類別。
public enum Priority implements Feature {
High(38) {
@Override public void perform() { System.out.println("high 38"); }
},
Medium(36.5) {
@Override public void perform() { System.out.println("medium 36.5"); }
},
Low(5.2) {
@Override public void perform() { System.out.println("low 5.2"); }
};
private final double value;
Priority(double v) { this.value = v; }
public abstract void perform(); // 強制每個值實作
public String getDescription(Priority p) { return null; }
}
運作機制:
High、Medium、Low)後的大括號定義匿名子類別,覆寫 perform()。Priority$1、Priority$2、Priority$3 類別。Priority.High.perform() 時,動態分派到對應子類別實作。public class Task {
private Priority priority;
public Task(Priority p) { this.priority = p; }
public void test() {
System.out.println(priority.getClass().getName());
// 輸出:Priority$1 / Priority$2 / Priority$3
}
}
public class TestSwitch {
public static void main(String[] args) {
new Task(Priority.High).test();
new Task(Priority.Medium).test();
new Task(Priority.Low).test();
}
}

| 優點 | 缺點 |
|---|---|
| 極致的物件導向:行為與資料封裝在常數內 | 語法複雜,易讓不熟悉開發者困惑 |
| 編譯期保證所有值實作抽象方法 | 除錯困難(匿名類別堆疊追蹤不直觀) |
| 避免龐大的 switch-case 分散邏輯 | 多數情況下 switch 或策略模式更清晰 |
建議:除非行為高度依賴常數身分且變化頻繁,否則優先考慮 switch、查表法或策略模式,保持程式碼可讀性。
enum Color { RED, GREEN, BLUE } 定義固定、封閉的常數集合。values() 取得陣列、valueOf(String) 反向查找、ordinal() 取得宣告順序、實作 Comparable、Serializable。Feature)。values()、valueOf()、ordinal() 自動完成。enum 替代 public static final int 常數群。switch 處理枚舉分派,編譯器會檢查是否覆蓋所有值(搭配 default 防禦新增值)。private final 欄位 + 建構子注入。switch 或策略模式,謹慎使用常數特定類別主體。EnumSet/EnumMap,效能與記憶體雙贏。枚舉類型將「常數」提升為「一等公民」,讓領域概念在型別系統中獲得原生表達能力,是 J2SE 5.0 最具實用價值的語言特性之一。