一、int 枚舉模式數組
- 在類型安全性和使用方便性沒有任何幫助
- apple_ 和orange_ 之間比較,編譯器不會有任何警告報出
- 十分脆弱,編譯枚舉時常量,編譯到使用他們的客戶端(int關聯發生變化須要從新編譯)

二、String 枚舉模式安全
- int 枚舉模式變體
- 常量可打印(int 枚舉模式打印出來就是數字),打印出來是字符串
- 會引來性能問題,由於依賴字符串比較
- 會使字符串硬編碼到客戶端代碼中(初級編碼會這樣,而不是使用適當域(field)名)
- 若是字符串有錯誤,運行時纔會發現,編譯時不會有任何警告
三、jdk 1.5之後的新枚舉app
- 這種模式本質上是int 值
- 基本思想:經過公有靜態 final 類爲每一個枚舉實例導出常量
- 沒有能夠訪問的構造器,枚舉是真正的final 類
- 枚舉實例是受控的,客戶端不能生成枚舉實例,不能擴展,只有聲明過的枚舉常量

四、枚舉提供了編譯時的類型安全函數
- 傳遞錯誤類型會致使編譯時報錯
- 試圖 == 比較時,各個常量是嚴格區分的
- 能夠增長或者從新編排枚舉類型代碼,無需修改客戶端代碼(由於常量值沒有被編譯到客戶端代碼中,存在int 模式中)
五、枚舉類型容許添加任意方法和域,實現任意接口性能
- 提供了全部Object 方法的高級實現,實現了Comparable 接口和 Serializable 接口
- 並針對枚舉類型的可任意改變性,設計了序列化方式
六、方法或域添加到枚舉類型中編碼
- 將數據和常量關聯起來(枚舉常量的屬性值)
- 可使用適當的方法加強枚舉類型(枚舉類型先成爲一個簡單集合,慢慢演變成全功能的抽象)
- 以下,星球枚舉類型,傳入質量和半徑建立常量
- 將數據與枚舉常量關聯起來,聲明實例域,編寫帶有數據,並將數據保存在域中的構造器
- 枚舉天生不可變,全部域都應該是final

七、不一樣行爲與每一個枚舉常量關聯起來,可使用以下抽象方法設計



八、枚舉類型有一個自動產生的方法3d
- valueOf 方法,將常量的名字轉變爲常量自己
- 若是在枚舉類型中覆蓋toString 方法,要考慮編寫一個fromString 方法(實現字符串變回相應枚舉)

- 枚舉構造器不能夠訪問枚舉的靜態域,編譯時常量除外(枚舉不容許在其構造函數中使用靜態引用)
- 枚舉類型語法要求:僅僅私有構造方法是容許的(以下)

九、枚舉常量中共享代碼更加困難blog
私有嵌套枚舉:策略枚舉接口

十、枚舉中的switch 語句,適合給外部的枚舉類型,增長特定於常量的行爲

十一、枚舉性能缺陷
- 裝載和初始化時會有空間和時間成本
- 枚舉優先使用 Comparable 而非 int常量
十二、每當須要固定常量數組的時候,使用枚舉
- 與int 相比,枚舉易讀、安全、功能強大
- 特定於常量的方法,優先啓用自有值枚舉
- 多個枚舉常量共享相同的行爲,考慮策略枚舉