原始的常量定義:
1 public static fianl MON=“Mon”; 2 public static final TUE="Tue";
創建枚舉類型要使用 enum 關鍵字,隱含了所創建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式Class Enum<E extends Enum<E>>
,而 E
表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal)
構造函數中,在這裡,每個值的名稱都被轉換成一個字符串,並且序數設置表示了此設置被創建的順序。
1 public enum EnumTest { 2 MON, TUE, WED, THU, FRI, SAT, SUN; 3 }
這段代碼實際上調用了7次 Enum(String name, int ordinal):
new Enum<EnumTest("MON",0); new Enum<EnumTest("TUE",1); new Enum<EnumTest("WED",2); ......
對enum進行遍歷和switch的操作示例代碼:
1 public class Test { 2 public static void main(String[] args) { 3 for (EnumTest e : EnumTest.values()) { 4 System.out.println(e.toString()); 5 } 6 7 System.out.println("----------------我是分隔線------------------"); 8 9 EnumTest test = EnumTest.THU; 10 switch (test) { 11 case MON: 12 System.out.println("今天是星期一"); 13 break; 14 case TUE: 15 System.out.println("今天是星期二"); 16 break; 17 // ... ... 18 default: 19 System.out.println(test); 20 break; 21 } 22 } 23 }MON TUE WED ... ------------我是分割線-------------- 今天是星期四
輸出結果:
1 public enum EnumTest{ 2 2 MON("星期一", 1), TUE("星期二", 2), WED("星期三", 3), THU("星期四", 4); 3 3 // 成員變量 4 4 private String name; 5 5 private int index; 6 6 7 7 // 構造方法 8 8 private EnumTest(String name, int index) { 9 9 this.name = name; 10 10 this.index = index; 11 11 } 12 // 覆蓋方法 13 @Override 14 public String toString() { 15 return this.index + "_" + this.name; 16 } 17 12 18 13 // 普通方法 19 14 public static String getName(int index) { 20 15 for (EnumTest e : EnumTest.values()) { 21 16 if (e.getIndex() == index) { 22 17 return e.name; 23 18 } 24 19 } 25 20 return null; 26 21 } 27 22 28 23 // get set 方法 29 24 public String getName() { 30 25 return name; 31 26 } 32 27 33 28 public void setName(String name) { 34 29 this.name = name; 35 30 } 36 31 37 32 public int getIndex() { 38 33 return index; 39 34 } 40 35 41 36 public void setIndex(int index) { 42 37 this.index = index; 43 38 } 44 39 }
1 public class Test { 2 public static void main(String[] args) { 3 // EnumSet的使用 4 EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class); 5 for (EnumTest day : weekSet) { 6 System.out.println(day); 7 } 8 9 // EnumMap的使用 10 EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class); 11 weekMap.put(EnumTest.MON, "星期一"); 12 weekMap.put(EnumTest.TUE, "星期二"); 13 // ... ... 14 for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) { 15 Entry<EnumTest, String> entry = iter.next(); 16 System.out.println(entry.getKey().name() + ":" + entry.getValue()); 17 } 18 } 19 }
enum 的語法結構盡管和 class 的語法不一樣,但是經過編譯器編譯之後產生的是一個class文件。該class文件經過反編譯可以看到實際上是生成了一個類,該類繼承了java.lang.Enum<E>。實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了語法的解析和編譯而已。
可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(java是單一繼承)。