原始的常量定義:
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是單一繼承)。