Enum是計算機編程語言中的一種數據類型。枚舉類型java
枚舉類型很早就在計算機語言中存在了,主要被用來將一組類似的值包含進一種類型中,這種類型的名稱被定義成獨一無二的類型描述符,這就是枚舉類型。面試
在java語言中,枚舉類型是一個完整功能的類,容許開發者給枚舉類型添加方法和屬性,同時也能夠提供接口。同時Java也爲Enum提供了高質量的實現,好比comparable和Serializable接口.編程
經過類的定義,能夠給Enum一些複雜的功能,例以下面代碼給Enum增長屬性:數組
public enum DrinkEnum{網絡
1. // 酒 2. Wine("a cup of wine "); 3. //橙汁 4. Oragen_Juice("a cup of oragen juice") 5. //Enum對象的drink_class屬性 6. private String drink_class; 7. //枚舉對象構造函數 8. private DrinkEnum(String drink){ 9. this.drink_class=drink; 10. } 11. //枚舉對象的drink_class屬性 12. public String getDrink(){ 13. return this.drink_class; 14. }
1 Enum 不支持public和protected修飾符的構造方法,所以構造函數必定要是private或者friendly的,這也就約束了枚舉對象是沒法在程序中經過直接調用構造函數進行初始化的。
jvm
2 Enum的值是經過運行期構造出來的對象表示的,所以在集羣環境下,每一個jvm構造出同義對象,可是在作布爾運算的時候有可能有問題,所以要格外注意。在對Enum進行比較的時候,使用值比對。
編程語言
在使用enum建立枚舉類型後,編譯器會爲其生成一個對應的枚舉類,這個類繼承與java.lang.Enum。舉例以下:函數
1. enum Day { 2. MONDAY, TUESDAY, WEDNESDAY, 3. THURSDAY, FRIDAY, SATURDAY, SUNDAY 4. }
編譯後會變成Day.class,那麼反編譯後看到以下:性能
1. final class Day extends Enum 2. { 3. //編譯器爲咱們添加的靜態的values()方法 4. public static Day[] values() 5. { 6. return (Day[])$VALUES.clone(); 7. } 8. //編譯器爲咱們添加的靜態的valueOf()方法,注意間接調用了Enum也類的valueOf方法 9. public static Day valueOf(String s) 10. { 11. return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s); 12. } 13. //私有構造函數 14. private Day(String s, int i) 15. { 16. super(s, i); 17. } 18. //前面定義的7種枚舉實例 19. public static final Day MONDAY; 20. public static final Day TUESDAY; 21. public static final Day WEDNESDAY; 22. public static final Day THURSDAY; 23. public static final Day FRIDAY; 24. public static final Day SATURDAY; 25. public static final Day SUNDAY; 26. private static final Day $VALUES[]; 27. static 28. { 29. //實例化枚舉實例 30. MONDAY = new Day("MONDAY", 0); 31. TUESDAY = new Day("TUESDAY", 1); 32. WEDNESDAY = new Day("WEDNESDAY", 2); 33. THURSDAY = new Day("THURSDAY", 3); 34. FRIDAY = new Day("FRIDAY", 4); 35. SATURDAY = new Day("SATURDAY", 5); 36. SUNDAY = new Day("SUNDAY", 6); 37. $VALUES = (new Day[] { 38. MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY 39. }); 40. } 41. }
能夠看到,編譯後生成一個final類,同時前面的七個日期定義成七個類型。同時還有兩個靜態方法,分別是values()和 valueOf(),MONDAY枚舉類型對應public static final Day MONDAY;,values()方法的做用就是獲取枚舉類中的全部變量,並做爲數組返回,而valueOf(String name)方法與Enum類中的valueOf方法的做用相似根據名稱獲取枚舉變量,只不過編譯器生成的valueOf方法更簡潔些只需傳遞一個參數。因爲values()方法是由編譯器插入到枚舉類中的static方法,因此若是咱們將枚舉實例向上轉型爲Enum,那麼values()方法將沒法被調用,由於Enum類中並無values()方法,valueOf()方法也是一樣的道理。學習
final變量常常和static關鍵字一塊兒使用,做爲常量。final類一般功能是完整的,不容許被繼承。
所以枚舉類型,在調用中若是對內部變量使用了set函數,那麼就是對一個常量進行了上set操做,也就會致使全部調用的地方的值都發生了變化。
若是對軟件測試、接口測試、自動化測試、性能測試、LR腳本開發、面試經驗交流。感興趣能夠175317069,羣內會有不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。
EnumSet是一個針對枚舉類型的高性能Set接口實現,可是在其中裝入的枚舉類型必須是同類型的,在EnumSet中經過bit-vector實現,也就是一個long型。EnumSet支持在遍歷。
1. for (WeekDayEnum day:EnumSet.range(WeekDayEnum.Mon,WeekDayEnum.Sun)){ 2. System.out.println(day) 3. }
同時EnumSet還提供了一個獲取子集的方法:
1. EnumSet <WeekDayEnum> JobDays = EnumSet.of(WeekDayEnum.Mon,WeekDayEnum.Fri);
EnumMap是一個高性能的Map接口實現,主要管理用枚舉作Key-Value的關係,內部是經過數組方式實現的。
1. private static Map<WeekDayEnum,RainbowClolor> schema = new EnumMap<WeekDayEnum.values()[i],RainbowClolor.values()[i]>(WeekDatEnum.class);