枚舉類型主要用於將一組相似的值定義到一種類型中,與常量的定義相似,但可以爲聲明的變量提供更大的取值範圍。
java
例如,當咱們定義一組顏色值來表示彩虹時,能夠定義一個以下的常量類型數組
public static class RainbowColor{ //定義彩虹顏色值 public static final int RED = 1; public static final int ORANGE = 1; public static final int YELLOW = 2; public static final int GREEN = 3; public static final int CYAN = 4; public static final int BLUE = 5; public static final int PURPLE = 6; }
而後就能夠在須要使用的時候直接引用這些變量。
安全
類型不安全:因爲顏色常量的對應值是整數形,因此程序執行過程當中頗有可能給顏色變量傳入一個任意的整數值,致使出現錯誤;服務器
沒有命名空間:顏色常量是RainbowColor類的屬性,沒有本身的命名空間,因此在須要使用的時候須要經過該類來訪問;性能
一致性差:由於整形枚舉屬於編譯期常量,因此編譯過程完成後,全部客戶端和服務器端引用的地方,會直接將整數值寫入。這樣,當你修改舊的枚舉整數值後或者增長新的枚舉值後,全部引用地方代碼都須要從新編譯,不然運行時刻就會出現錯誤。this
Java將枚舉類型的定義轉變爲了一個功能完整的類的定義,因此枚舉類型使用很是靈活,能夠添加任意屬性和方法,實現任意接口;spa
Java 平臺爲 Enum 類型提供了高質量的實現,好比默認實現 Comparable 和 Serializable 接口;code
使用枚舉類型能夠擴大switch語句的適用範圍,Java JDK 5.0 以前,switch 的值只可以是簡單類型,好比 int、byte、short、char, 有了枚舉類型以後,就可使用對象了。
對象
enum 關鍵字加上名稱和大括號包含起來的枚舉值體,如:接口
enum RainbowColor{RED, ORANGE,YELLOW, GREEN, CRAN, BLUE, PURPLE}
//定義一個表示星期的枚舉類型 public enum Week{ Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7); //枚舉類型屬性 index,表示星期的值 private int index; //構造方法,注意是pricate的 private Week(int weekIndex){ this.index = weekIndex; } //枚舉類型方法 public int getIndex(){ return this.index; } }
以上代碼自定義了一個枚舉類型,在該自定義的枚舉類型中設置了類型私有屬性和構造方法以及其餘方法。
注意:枚舉類型的構造方法只能被private和friendly修飾,而不可以使用public和protected修飾符,由於枚舉對象的取值是事先給定的,沒法在程序中動態設置。
EnumSet 是一個針對枚舉類型的高性能的 Set 接口實現。EnumSet 中裝入的全部枚舉對象都必須是同一種類型,在其內部,是經過 bit-vector 來實現,也就是經過一個 long 型數。EnumSet 支持在枚舉類型的全部值的某個範圍中進行迭代。
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun } for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) { System.out.println(day); }
EnumMap 也是一個高性能的 Map 接口實現,用來管理使用枚舉類型做爲 keys 的映射表,內部是經過數組方式來實現。EnumMap 將豐富的和安全的 Map 接口與數組快速訪問結合到一塊兒,若是你但願要將一個枚舉類型映射到一個值,你應該使用 EnumMap。
// 定義一個 EnumMap 對象,映射表主鍵是日期枚舉類型,值是顏色枚舉類型 private static Map<WeekDayEnum, RainbowColor> schema = new EnumMap<WeekDayEnum, RainbowColor>(WeekDayEnum.class); static{ // 將一週的每一天與彩虹的某一種色彩映射起來 for (int i = 0; i < WeekDayEnum.values().length; i++) { schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]); } } System.out.println("What is the lucky color today?"); System.out.println("It's " + schema.get(WeekDayEnum.Sat));