枚舉類型
枚舉類型是Java5新增的特性之一,枚舉是一種特殊類型的類,其枚舉的每一個值都是該枚舉類
的一個實例。枚舉類型是作為Java語言的一部分,是完全類型安全的,編譯器會幫助我們檢查枚
舉類型的正確性。
枚舉聲明
在枚舉類型出現之前,當需要定義一些常量時,我們經常使用接口的靜態常量來實現。這種方式
沒有錯誤,但沒有枚舉類型安全,將接口中的不同靜態常量初始化為相同值時,編譯並不會發出
警告,所以我們更提倡使用枚舉類型。
//接口實現
public class EnumTest{ public static void main(String[] args){ int red = Color.RED; System.out.println(red); } } interface Color{ int RED = 0; int YELLOW = 1; int BLUE = 2; }
//枚舉類型實現
public class EnumTest{ public static void main(String[] args){ Color red = Color.RED; System.out.println(red); } } enum Color{ RED,YELLOW,BLUE }
枚舉聲明是由關鍵字enum、該枚舉類型的標識符及枚舉常量構成的,這些常量是枚舉類的靜態字
段,每個常量實際上是該枚舉類的一個實例,常量之間用逗號隔開。
枚舉類中除了枚舉常量也可以聲明其他成員,但在聲明其他成員之前,必須先聲明所有的枚舉常量
,而且最后一個常量以分號結尾。
public class EnumTest{ public static void main(String[] args){ Color red = Color.RED; System.out.println(red); } } enum Color{ RED("red"), YELLOW("yellow"), BLUE("blue"); //當有其他成員時,最后一個常量以分號結尾
private String info; private Color(String info){ //私有構造函數
this.info = info; } public void setInfo(String info){ this.info = info; } public String getInfo(){ return info; } public String toString(){ //覆蓋toString()方法
return name()+":"+info; } }
枚舉常量都是在類內聲明的,為防止在外部聲明,構造函數需要用private修飾,可省略不寫,
而且在構造器中不能使用該枚舉類的非靜態常量字段。
聲明枚舉常量時,不可以用new來構建實例,而是像上面代碼那樣,直接用枚舉常量來聲明,
有參數時將參數寫在一對括號之間。
枚舉原理
在使用enum創建枚舉類型並編譯后,編譯器會將枚舉類編譯成獨立的類文件,如圖:

為了深入地理解枚舉類的構建原理,我用Java Decompiler將枚舉類進行了反編譯。
//反編譯后的代碼
final class Color extends Enum { public static Color[] values() { return (Color[])$VALUES.clone(); } public static Color valueOf(String s) { return (Color)Enum.valueOf(Color, s); } private Color(String s, int i) { super(s, i); } public static final Color RED; public static final Color YELLOW; public static final Color BLUE; private static final Color $VALUES[]; static { RED = new Color("RED", 0); YELLOW = new Color("YELLOW", 1); BLUE = new Color("BLUE", 2); $VALUES = (new Color[] { RED, YELLOW, BLUE }); } }
從反編譯后的代碼中,我們可以看出以下幾點:
1)枚舉類繼承了Enum類。
枚舉類隱式地繼承了java.lang.Enum,Java類只支持單繼承,所以枚舉類不能繼承其他類,
但可以實現接口。
2)枚舉類是final的,我們不能再繼承枚舉類。
3)枚舉常量通過靜態塊來進行初始化,序數是從0開始的。
4)編譯器為我們自動增加了values()和valueof(String name)方法。
public static E[ ] values():返回包含了所有枚舉常量的數組。
public static E valueof(String name): 返回指定名字的枚舉常量。
結束
枚舉類作為Java語言的一部分,是類型安全的,並且在switch語句中也可以使用枚舉類型,這為
我們提供了很多方便。當我們需要聲明一個有關實例的人所共知的閉集時,枚舉類型是一個不錯
的選擇。作為編程新手的我,在每次分享中,總會出現許多錯誤,期待並感謝大牛們的指正。
