??許多枚舉自然地與單個int值相關聯(lián)。所有枚舉都有它們的順序號方法,返回每個枚舉常量在它的類型的數(shù)值位置。你可能會傾向于從序號導出關聯(lián)的int值:

image.png
??雖然這個枚舉可以工作,但它卻是維護的噩夢。如果這些常量重排了,numberOfMusicians方法就崩了。如果你想要添加一個第二個枚舉常量關聯(lián)一個早已使用的int值,你就運氣不好了。比如,為雙四重奏加上一個常量可能會更好,它就像一個八重奏一樣,由八個音樂家組成,但是沒有辦法做到這一點。
??另外,如果不為所有中間的int值添加常量,就不能為int值添加常量。比如,假設你想要添加一個常量代表一個三重奏,它包含了十二個音樂家。沒有一個由11為音樂家組成的樂團的標準術語,因此你必須為未使用的int值(11)添加一個虛擬常量。充其量,這是丑陋的,如果許多int值未使用,那么這是不切實際的。
??幸運的是,這里有一個為這些問題的一個簡單的解決方案。永遠不要從枚舉的順序值中導出關聯(lián)的值;而是存儲它在一個實例字段中:

image.png
??Enum規(guī)范有關序數(shù)的說明:“這個方法對于大多數(shù)程序員沒有用,它是為通用的數(shù)據(jù)結構(如EnumSet和EnumMap)所設計的”。除非你正在用此字符編碼,你最好完全避免使用序號方法。
本文寫于2019.7.8,歷時1天