用enum 代替int (30)

一、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 相比,枚舉易讀、安全、功能強大
  • 特定於常量的方法,優先啓用自有值枚舉
  • 多個枚舉常量共享相同的行爲,考慮策略枚舉
相關文章
相關標籤/搜索