Tips
《Effective Java, Third Edition》一書英文版已經出版,這本書的第二版想必不少人都讀過,號稱Java四大名著之一,不過第二版2009年出版,到如今已經將近8年的時間,但隨着Java 6,7,8,甚至9的發佈,Java語言發生了深入的變化。
在這裏第一時間翻譯成中文版。供你們學習分享之用。程序員
許多枚舉一般與單個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
方法說道:「大多數程序員對這種方法沒有用處。 它被設計用於基於枚舉的通用數據結構,如EnumSet
和EnumMap
。「除非你在編寫這樣數據結構的代碼,不然最好避免使用ordinal
方法。設計