在現實開發中,我們經常會遇到一組固定、有限的數據集合,例如一周的七天、四季、訂單狀態、性別等。這些「受限數據集」若直接用字串或整數表示,不僅缺乏類型安全,也容易因拼寫錯誤導致 Bug。Java 5 引入的 Enum(枚舉類型) 正是為了解決這類問題而設計的強大工具。
傳統做法可能定義一堆 public static final int 常量,但這樣無法限制變數只能接受特定值,也無法附帶行為。Enum 不僅提供了類型安全,還能像類一樣擁有屬性、方法、實現介面,甚至每個枚舉常量都能擁有專屬的實現邏輯。
public enum ColorEnum {
RED, GREEN, YELLOW, BLUE
}
編譯器會自動生成繼承 java.lang.Enum 的最終類,每個常量都是單例實例。
public enum Gender {
MAN("M"), WOMAN("F");
private final String code;
Gender(String code) { this.code = code; }
public String getCode() { return code; }
}
建構子預設為 private,確保外部無法任意建立實例。
public enum OrderState {
CANCEL { public String getName() { return "已取消"; } },
WAIT_PAY { public String getName() { return "待付款"; } };
public abstract String getName();
}
每個常量可覆寫抽象方法,實現「策略模式」的輕量級變體。
values():取得所有常量陣列,支援迭代valueOf(String):依名稱取得常量,找不到拋出異常ordinal():取得宣告順序(從 0 起),慎用於業務邏輯compareTo(E):實作 Comparable,按宣告順序比較name():取得常量名稱(不可覆寫)利用抽象方法讓每個狀態自帶轉換規則,避免龐大的 switch-case。
Enum 是實現線程安全單例的最佳方式(Effective Java Item 3)。
public interface Exporter { void export(Data d); }
public enum ExportType implements Exporter {
CSV { public void export(Data d) { /*...*/ } },
PDF { public void export(Data d) { /*...*/ } };
}
final,保證不可變性switch 表達式 寫出更簡潔的分支邏輯Java Enum 遠不止「一組常數」,它是「受限實例集合」的第一公民。善用其「類特性 + 單例保證 + 類型安全」三重優勢,能讓領域模型更精準、代碼更健壯、維護更輕鬆。下次面對「固定選項」業務時,請優先考慮 Enum。