Java 中的枚舉類型采用關鍵字enum 來定義,從jdk1.5才有的新類型,所有的枚舉類型都是繼承自Enum 類型。枚舉類型的定義也非常的簡單,用
enum 關鍵字加上名稱和大括号包含起來的枚舉值體即可,例如上面提到的彩虹顔色就可以用新的 enum 方式來重新定義:
enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }
從上面的定義形式來看,似乎 Java 中的枚舉類型很簡單,但實際上 Java
語言規範賦予枚舉類型的功能非常的強大,它不僅是簡單地将整形數值轉換成對象,而是将枚舉類型定義轉變成一個完整功能的類定義。這種類型定義的擴充允許開發者給枚舉類型增加任何方法和屬性,也可以實作任意的接口。
enum擴大了 switch 語句使用範圍。5.0 之前,Java 中 switch 的值隻能夠是簡單類型,比如 int、long、char,
有了枚舉類型之後,就可以使用對象了。這樣一來,程式的控制選擇就變得更加的友善,看下面的例子:
對于這些枚舉的日期,JVM 都會在運作期構造成出一個簡單的對象執行個體一一對應。這些對象都有唯一的 identity,類似整形數值一樣,switch
語句就根據此來進行執行跳轉。
除了最常見的枚舉定義形式外,如果需要給枚舉類型增加一些複雜功能,也可以通過類似 class 的定義來給枚舉進行定制。比如要給 enum
類型增加屬性、添加構造方法或抽象方法,
不過在使用 Enum 時候有幾個地方需要注意:
enum 類型不支援 public 和 protected 修飾符的構造方法,是以構造函數一定要是private 或 friendly
的。也正因為如此,是以枚舉對象是無法在程式中通過直接調用其構造方法來初始化的。
定義 enum
類型時候,如果是簡單類型,那麼最後一個枚舉值後不用跟任何一個符号;但如果有定制方法,那麼最後一個枚舉值與後面代碼要用分号‘;‘隔開,不能用逗号或空格。
由于 enum 類型的值實際上是通過運作期構造出對象來表示的,是以在cluster
環境下,每個虛拟機都會構造出一個同義的枚舉對象。因而在做比較操作時候就需要注意,如果直接通過使用等号 ( ‘ == ’ )
操作符,這些看似一樣的枚舉值一定不相等,因為這不是同一個對象執行個體。