Effective Java Item38:用介面模擬可擴展的 enum

整理Effective Java書中Item 38: Emulate extensible enums with interfaces心得筆記

主旨

Java 的 enum 雖然功能強大,但有一個主要限制:enum 是封閉的類型,不能被擴展。這意味著一旦定義了 enum,就無法在不修改原始程式碼的情況下添加新的值。這篇文章介紹如何使用介面來解決這個問題。

問題:enum 的封閉性

public enum Operation {
    PLUS {
        double apply(double x, double y) { return x + y; }
    },
    MINUS {
        double apply(double x, double y) { return x - y; }
    },
    TIMES {
        double apply(double x, double y) { return x * y; }
    },
    DIVIDE {
        double apply(double x, double y) { return y == 0 ? Double.POSITIVE_INFINITY : x / y; }
    };

    abstract double apply(double x, double y);
}
Read more

Effective Java Item37:用 EnumMap 取代 int 索引的陣列

整理Effective Java書中Item 37: Use EnumMap instead of ordinal indexing心得筆記

主旨

在 Java 中,我們有時會用 int 索引的陣列來儲存與 enum 相關的資料,但這種做法容易造成型別不安全和可讀性問題。Java 提供了 EnumMap 類別,專門用來處理 enum 類型的映射關係,提供更安全、更清楚的解決方案。

問題:int 索引陣列的缺點

假設我們要儲存每個星期幾的開門時間,傳統作法可能會這樣寫:

public class StoreHours {
    private static final int[] OPENING_HOURS = {
        9,  // Monday
        9,  // Tuesday
        9,  // Wednesday
        9,  // Thursday
        9,  // Friday
        10, // Saturday
        10  // Sunday
    };

    public int getOpeningHour(Day day) {
        return OPENING_HOURS[day.ordinal()];
    }
}
Read more

Effective Java Item36:請用 EnumSet 取代位元欄位

整理Effective Java書中Item 36: Use EnumSet instead of bit fields心得筆記

主旨

在 Java 裡,用 intlong 表示多種布林選項的做法已經過時了,這種設計方式可讀性差又容易出錯。現在有更好的選擇 —— EnumSet。它不但語意清楚、效能高,而且更安全、好維護。

Read more

Effective Java Item35:請用實例欄位而非 ordinal()

整理Effective Java書中Item 35: Use instance fields instead of ordinals心得筆記

主旨

雖然 enum.ordinal() 這個方法看起來很方便,可以讓你直接取得列舉常數的順序編號,但實際上使用它來表示邏輯意義是非常危險的作法。這一則要點告訴我們:如果你需要用 enum 來代表某種數值或邏輯資訊,應該用實例欄位來明確定義,而不要依賴 ordinal() 的數字順序。

Read more

Effective Java Item34:用 enum 取代 int 常數

整理Effective Java書中Item 34: Use enum instead of int constant心得筆記

主旨

很多 Java 初學者一開始會用 int 常數(例如 1=小、2=中、3=大)來表示一組固定的狀態。但這種做法其實會讓程式容易出錯、不易維護,也看不出意思。Java 後來加入了 enum(列舉型別),提供更安全、清楚、有彈性的方式來處理這類需求。這篇文章會說明為什麼你應該用 enum 取代 int 常數。

Read more