Effective java中對於枚舉的建議

枚舉和註解

1.用enum代替int常量

       以前的int枚舉類型(public static final int APPLE_FUJI = 0)不具有安全性,也沒有描述性。Int枚舉是編譯時常量,很難將int枚舉常量轉換爲可打印的字符串,還有一種變體就是String類型的(淘汰)
       簡單的枚舉類型
       Public enum Apple{FUJI,PIPPIN,GRANNY_SMITH}
       Java枚舉本質上是int值
       枚舉類型是實例受控的,他們是單例(singleton)的泛型化,本質上是單元素的枚舉
       枚舉類型保證了編譯時的類型安全。
       包含同名常量的多個枚舉類型可以在一個系統中和平共處,因爲命名空間不同。
       枚舉類型還允許添加任意的方法和域,並實現任意的接口。
       爲了將數據與枚舉常量關聯起來,得聲明實例域,並編寫一個帶有數據並且將數據保存在域中的構造器。
       枚舉常量無法通過其構造器訪問另一個構造器。
       枚舉中的switch語句適合於給外部的枚舉類型增加特定於常量的行爲。

  使用枚舉的場景
每當需要一組固定常量,並且在編譯時就知道其成員的時候,就應該使用枚舉。

       枚舉類型中的常量類型並不一定始終不變。
       如果多個(但非所有)枚舉常量同時共享相同的行爲,則考慮策略枚舉

2.用實例域代替序數

        所有的枚舉都有一個ordinal方法,它返回每一個枚舉常量在類型中的數字位置。
        永遠不要根據枚舉的序數導出與它關聯的值,而是要將他保存在一個實例域中。

3.用EnumSet代替位域

       如果一個枚舉類型的元素主要用在集合中,一般使用int枚舉類型。
       Text.applyStyles(STYLE_BOLD | STYLE_ITALIC)
       這種表示法讓你用OR位運算將幾個常量合併到一個集合中,稱爲位域
       位域表示法也允許利用位操作,有效的執行像union(聯合)和intersection(交集)這樣的集合運算。缺點很多。
       Java.uitl包提供了EnumSet類來有效的表示從單個枚舉類型中提取的多個值的多個集合。
       每個EnumSet內容都表示爲位矢量。

4.用EnumMap代替序數索引

       Map<Plant.lifeCycle, SET> plantsByLifeCycle = new EnumMap<>(Plant.LifeCycle.class)
       EnumMap構造器採用鍵類型的Class對象,這是一個有限制的類型令牌,提供了運行時的泛型信息。
       最好不要用序數來索引數組,而要使用EnumMap

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章