Java Enum總結


枚舉類型

枚舉類型是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語句中也可以使用枚舉類型,這為

我們提供了很多方便。當我們需要聲明一個有關實例的人所共知的閉集時,枚舉類型是一個不錯

的選擇。作為編程新手的我,在每次分享中,總會出現許多錯誤,期待並感謝大牛們的指正。

   

 

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM