Java 5 引入 enum 關鍵字,提供型別安全的列舉實作。列舉不僅是常數集合,更是功能完整的類別,支援欄位、方法、介面實作與單例模式。本文從原理、反編譯、常見用法三個面向深入解析。
定義列舉:
public enum Season { SPRING, SUMMER, AUTUMN, WINTER }
反編譯後可見:
Season 為 final 類別,繼承 java.lang.Enum。SPRING 等)皆為 Season 的 static final 實例,在靜態初始化區塊 <clinit> 中建立。values() 回傳所有常數陣列,valueOf(String) 依名稱取得常數。enum Singleton { INSTANCE } 實作單例。public enum Operation {
PLUS("+") { public int apply(int a, int b) { return a + b; } },
MINUS("-") { public int apply(int a, int b) { return a - b; } };
private final String symbol;
Operation(String symbol) { this.symbol = symbol; }
public abstract int apply(int a, int b);
}
interface Op { int execute(int a, int b); }
enum OpEnum implements Op {
ADD("+") { public int execute(int a, int b) { return a + b; } },
SUB("-") { public int execute(int a, int b) { return a - b; } };
private final String key;
OpEnum(String key) { this.key = key; }
}
// 使用
Map map = new HashMap<>();
for (OpEnum e : OpEnum.values()) map.put(e.key, e);
int result = map.get("+").execute(1, 2); // 3
Java 列舉是功能強大的型別,遠不止常數集合。善用其單例特性、多態行為與介面實作,能寫出更安全、可維護的程式碼。建議在「固定集合、需行為封裝、單例需求」等場景優先考慮列舉。