編程思想 -- 第19章 -- 枚舉類型

枚舉類型
    關鍵字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誕的其他功能結合使用,如多態,泛型和反射。
    

    
   

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