首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2SE

Eclipse 3.1 深度體驗 J2SE 5.0 枚舉類型 (7):常數特定類別主體與總結

     編輯:J2SE

常數特定類別主體:枚舉值的多型行為

J2SE 5.0 枚舉不僅是常數集合,每個枚舉值還可擁有專屬的類別主體,實現針對特定常數的行為差異——本質上是為每個枚舉值生成匿名內部子類別。

核心範例:Priority 枚舉

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、查表法或策略模式,保持程式碼可讀性。

枚舉類型完整小結

核心特性回顧

  1. 簡單性:enum Color { RED, GREEN, BLUE } 定義固定、封閉的常數集合。
  2. 型別安全:編譯器保證變數只能持有該枚舉定義的值,杜絕非法整數傳入。
  3. 物件本質:每個值都是枚舉類別的單例實例,可擁有欄位、方法、建構子、介面實作。
  4. 內建功能:values() 取得陣列、valueOf(String) 反向查找、ordinal() 取得宣告順序、實作 Comparable、Serializable。

進階應用組合

  • EnumMap:鍵為枚舉的高效 Map 實作(陣列底層,無雜湊開銷)。
  • EnumSet:位向量實作的高效 Set,支援範圍、補集、全集操作。
  • 介面實作:讓多個枚舉共享行為契約(如 Feature)。
  • 建構子參數:賦予每個常數豐富屬性(如優先級數值、顏色代碼)。

Eclipse 3.1 開發體驗總結

  • 建立精靈:File → New → Enum,自動生成骨架與常數佔位符。
  • 即時錯誤提示:建構子非 private 報錯、switch-case 中加上類別前綴報錯、靜態修飾符於常數前報錯。
  • 內容輔助:values()、valueOf()、ordinal() 自動完成。

最佳實踐清單

  1. 優先使用 enum 替代 public static final int 常數群。
  2. 善用 switch 處理枚舉分派,編譯器會檢查是否覆蓋所有值(搭配 default 防禦新增值)。
  3. 需關聯資料時,用 private final 欄位 + 建構子注入。
  4. 需行為差異時,優先考慮 switch 或策略模式,謹慎使用常數特定類別主體。
  5. 集合操作首選 EnumSet/EnumMap,效能與記憶體雙贏。

枚舉類型將「常數」提升為「一等公民」,讓領域概念在型別系統中獲得原生表達能力,是 J2SE 5.0 最具實用價值的語言特性之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved