枚舉類型
關鍵字enum可以將一組具名的值的有限集合創建爲一種新的類型,而這些具名的值可以作爲常規的程序組件使用,這是一種非常有用的功能。
一、基本enum特性
調用enum的values()方法,可以遍歷enum實例。values()方法返回enum實例的數組,而且該數組中的元素嚴格保持其在enum中聲明時的順序,因此你可以在循環中使用values()返回的數組。
創建enum時,編譯器會爲你生成一個相關的類,這個類繼承自java.lang.Enum。
二、向enum中添加新方法
除了不能繼承自一個enum外,基本上可以將enum看做一個常規的類。
三、switch語句中的enum
在switch中使用enum,是enum提供的一項非常便利的功能。一般來說,在switch中只能使用整數值,而枚舉實例天生就具備整數值的次序並且可以通過ordinal()方法取得其次序,因此我們可以在switch語句中使用enum。
四、values()的神祕之處。
編譯器爲你創建的enum類都繼承自enum類,然而enum類並沒有values()方法,values()是由編譯器添加的static方法。在創建對象的過程中,編譯器爲其添加了valueOf()的方法。
五、實現,而非繼承
所有的enum都繼承自java.lang.enum類,由於java不支持多重繼承,所以enum不能再繼承其他類。
六、隨機選取
從enum實例中進行隨機選擇,可以利用泛型,從而使得工作更一般化。
七、使用接口組織枚舉
在接口的內部,創建實現該接口的枚舉,以此將元素進行分組,可以達到將枚舉元素分類組織的目的。
八、使用EnumSet替代標誌
Enum看起來具有集合的行爲,由於不能從enum中刪除或添加元素,所以它只能算不太有用的集合。EnumSet的基礎是long,一個long值有64位,它非常快速高效。
九、使用EnumMap
EnumMap是一種特殊的Map,它要求其中的鍵必須來自一個enum,由於enum本身的限制,所以EnumMap在內部可由數組實現。因此EnumMap的速度很快,可以使用enum實例在Enummap中進行查找操作。
十、常量相關的方法
Java的Enum允許程序員爲enum實例編寫方法,從而爲每個enum實例賦予各自不同的行爲。要實現常量相關的方法,你需要爲enum定義一個或多個abstract方法,然後爲每個enum實例實現該抽象方法。
編譯器不允許我們將一個enum實例當作class使用,我們分析一下編譯器生成的代碼,就知道這種行爲也是很正常的。因爲每個enum元素都是一個LikeClass類型的static final實例。
雖然enum有某些限制,但是一般而言,我們還是可以將其看作是類。
枚舉類型非常適合用來創建狀態機。
十一、多路分發。
Java只支持單路分發,如果要執行的操作包含了不止一個類型位置的對象時,java的動態綁定機制只能處理其中一個的類型。必須自己判定其他的類型,從而實現自己的動態綁定行爲。解決方法是多路分發。
十二、總結
enum可以與Java誕的其他功能結合使用,如多態,泛型和反射。