枚舉是Java 5開始支援的新特性,其作用是將一組相關的常量定義在一個類型中,這樣在使用時就只能使用這些有限的常量。先定義一個代表一周七天的枚舉類型作為範例: Java代碼 enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURDAY };
enum Weekday { SUNDAY, MONDAY, TUESDAY, WEDNSDAY, THURSDAY, FRIDAY, SATURDAY};
這樣就定義好了一個Weekday枚舉類型,注意最後的分號是可以省略的。因為Weekday中只有7個成員,所以Weekday的變數只能取其中一個值,例如: Java代碼 Weekday wd = Weekday.MONDAY;
Weekday wd = Weekday.MONDAY;
這樣看起來枚舉類型似乎很簡單,其實它本質上是一個類,其隱含的父類是java.lang.Enum,所以Weekday自動繼承了Enum的方法,其中有兩個挺有用,一個叫ordinal(),返回成員的聲明順序編號,這是一個整數,值從0開始編號,比如Weekday.SUNDAY.ordinal()返回0,而Weekday.MONDAY.ordinal()返回1。另一個方法叫做name(),返回枚舉成員的名稱。
更有意思的是,枚舉類型可以直接用於switch語句,這個功能看起來是突破了Java中switch只能用於整數和字元的限制,不過其實是Java編譯器的障眼法,Java編譯器會自動在枚舉成員上調用ordinal()方法,例如: Java代碼 Weekday wd = Weekday.FRIDAY; switch (wd) { case MONDAY: System.out.println("這個星期才剛開始,慢慢等吧"); break; ... case FRIDAY: System.out.println("周末來了,好好享受吧"); break; ... }
Weekday wd = Weekday.FRIDAY;switch (wd) {case MONDAY: System.out.println("這個星期才剛開始,慢慢等吧"); break;...case FRIDAY: System.out.println("周末來了,好好享受吧"); break;...}
如果像遍曆Weekday,那麼可以使用它隱含的靜態方法values(),這個方法在文檔中找不到定義,是Java編譯器自己加上去的,很奇怪。 例如: Java代碼 for (Weekday wd : Weekday.values()) { System.out.println(wd + ", 順序: " + wd.ordinal()); }
for (Weekday wd : Weekday.values()) { System.out.println(wd + ", 順序: " + wd.ordinal());}
以上是枚舉的基本用法,實際上枚舉本身要複雜的多,比如可以定義建構函式,定義欄位,定義和重寫方法,甚至可以在枚舉的常量中重寫枚舉中的方法,這些內容將在下一篇文章中介紹。