Effective Java 第三版——35. 使用實例屬性替代序數

Tips
《Effective Java, Third Edition》一書英文版已經出版,這本書的第二版想必不少人都讀過,號稱Java四大名著之一,不過第二版2009年出版,到如今已經將近8年的時間,但隨着Java 6,7,8,甚至9的發佈,Java語言發生了深入的變化。
在這裏第一時間翻譯成中文版。供你們學習分享之用。程序員

Effective Java, Third Edition

35. 使用實例屬性替代序數

許多枚舉一般與單個int值關聯。全部枚舉都有一個ordinal方法,它返回每一個枚舉常量類型的數值位置。你可能想從序數中派生一個關聯的int值:數據結構

// Abuse of ordinal to derive an associated value - DON'T DO THIS

public enum Ensemble {

    SOLO,   DUET,   TRIO, QUARTET, QUINTET,

    SEXTET, SEPTET, OCTET, NONET,  DECTET;



    public int numberOfMusicians() { return ordinal() + 1; }

}

雖然這個枚舉能正常工做,但對於維護來講則是一場噩夢。若是常量被從新排序,numberOfMusicians方法將會中斷。 若是你想添加一個與你已經使用的int值相關的第二個枚舉常量,則沒有那麼好運了。 例如,爲雙四重奏(double quartet)添加一個常量可能會很好,它就像八重奏同樣,由8位演奏家組成,可是沒有辦法作到這一點。學習

此外,若是沒有給全部這些int值添加常量,也不能爲某個int值添加一個常量。例如,假設你想要添加一個常量,表示一個由12位演奏家組成的三重四重奏(triple quartet)。對於由11個演奏家組成的合奏曲,並無標準的術語,所以你不得不爲未使用的int值(11)添加一個虛擬常量(dummy constant)。最多看起來就是有些很差看。若是許多int值是未使用的,則是不切實際的。this

幸運的是,這些問題有一個簡單的解決方案。 永遠不要從枚舉的序號中得出與它相關的值; 請將其保存在實例屬性中翻譯

public enum Ensemble {

    SOLO(1), DUET(2), TRIO(3), QUARTET(4), QUINTET(5),

    SEXTET(6), SEPTET(7), OCTET(8), DOUBLE_QUARTET(8),

    NONET(9), DECTET(10), TRIPLE_QUARTET(12);



    private final int numberOfMusicians;

    Ensemble(int size) { this.numberOfMusicians = size; }

    public int numberOfMusicians() { return numberOfMusicians; }

}

枚舉規範對此ordinal方法說道:「大多數程序員對這種方法沒有用處。 它被設計用於基於枚舉的通用數據結構,如EnumSetEnumMap。「除非你在編寫這樣數據結構的代碼,不然最好避免使用ordinal方法。設計

相關文章
相關標籤/搜索