將一組有限集合創建為一種新的類型,集合裡面的值可以作為程序組件使用;
以下代碼是枚舉的簡單使用:
使用values方法返回enum實例的數組
使用ordinal方法返回每個enum實例的次序,從0開始
使用compareTo方法比較兩個enum實例
使用==來比較enum實例
使用getDeclaringClass方法返回enum實例所屬的enum類
使用valueOf方法根據指定的名字返回enum實例
package enumerated; enum Shrubbery { GROUND, CRAWLING, HANGING } public class EnumClass { public static void main(String[] args) { for (Shrubbery s : Shrubbery.values()) { System.out.println(s + " ordinal: " + s.ordinal()); System.out.println(s.compareTo(Shrubbery.CRAWLING) + " "); System.out.println(s.equals(Shrubbery.CRAWLING) + " "); System.out.println(s == Shrubbery.CRAWLING); System.out.println(s.getDeclaringClass()); System.out.println(s.name()); System.out.println("----------------------"); } // Produce an enum value from a string name: for (String s : "HANGING CRAWLING GROUND".split(" ")) { Shrubbery shrub = Enum.valueOf(Shrubbery.class, s); System.out.println(shrub); } } }
注意枚舉enum默認是繼承自java.lang.Enum類的,在以上代碼中,Shrubber為一個枚舉類, GROUND, CRAWLING, HANGING為這個enum類的實例,由於Shrubber已經繼承自java.lang.Enum類,所以它是不能在繼承其它enum類;
另外,在使用枚舉的時候,可以考慮使用靜態導入枚舉類型,省去使用枚舉類型修飾枚舉實例;
enum基本上是可以被看做一個常規的類,可以向其添加方法,甚至main方法;
如下代碼,在枚舉類內部添加一個構造方法和getDescription方法, 注意,當定義自己方法的時候,需要在enum實例序列的最後一個後面添加分號,且要先定義enum實例再定義方法;
package enumerated; public enum OzWitch { // Instances must be defined first, before methods: WEST("Miss Gulch, aka the Wicked Witch of the West"), NORTH("Glinda, the Good Witch of the North"), EAST("Wicked Witch of the East, wearer of the Ruby Slippers, crushed by Dorothy's house"), SOUTH("Good by inference, but missing"); private String description; // Constructor must be package or private access: private OzWitch(String description) { this.description = description; } public String getDescription() { return description; } public static void main(String[] args) { for (OzWitch witch : OzWitch.values()) System.out.println(witch + ": " + witch.getDescription()); } }
再看一個例子,覆蓋Enum類的方法,如下代碼,覆蓋toString方法,將枚舉的name首字母大寫,其余轉為小寫,:
package enumerated; public enum SpaceShip { SCOUT, CARGO, TRANSPORT, CRUISER, BATTLESHIP, MOTHERSHIP; public String toString() { String id = name(); String lower = id.substring(1).toLowerCase(); return id.charAt(0) + lower; } public static void main(String[] args) { for (SpaceShip s : values()) { System.out.println(s); } } }
如下代碼是枚舉在switch語句中的使用,注意在case語句裡,枚舉實例前面是不需要寫上枚舉類型的,強行寫上(如Signal.RED)編譯器會報錯;
package enumerated; // Define an enum type: enum Signal { GREEN, YELLOW, RED, } public class TrafficLight { Signal color = Signal.RED; public void change() { switch (color) { // Note that you don't have to say Signal.RED // in the case statement: case RED: color = Signal.GREEN; break; case GREEN: color = Signal.YELLOW; break; case YELLOW: color = Signal.RED; break; } } public String toString() { return "The traffic light is " + color; } public static void main(String[] args) { TrafficLight t = new TrafficLight(); for (int i = 0; i < 7; i++) { System.out.println(t); t.change(); } } }
我們已經知道枚舉類是繼承java.lang.Enum類的,但是查看Enum源代碼卻沒有發現有values()方法,那麼values()方法是哪裡來的呢?
答案是,values()方法是由編譯器添加的靜態方法,有興趣可以利用反射機制去查看,如上面的例子,可以編寫如下代碼查看:
Method[] methods = Signal.class.getMethods();
參考資料:JAVA編程思想--4