天天看點

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

Enum枚舉類型

Enum的全寫是Enumeration,這個詞的翻譯是列舉、逐條陳述、細目。在程式語言中,枚舉類型是一種特殊的資料類型(常用的資料類型比如字元串、整型),這種資料類型的變量值限定在固定的範圍, 比如季節隻有春夏秋冬,月份是12個。

Java中的枚舉

枚舉前時代:在Java語言中, 枚舉類型從JDK1.5才開始提供。在這之前使用接口靜态常量來實作相關功能(也可以是類靜态常量),以季節為例:

在不使用枚舉類之前,一般使用接口靜态常量實作。比如:

public interface Season {    public static final int SPRING = 1;    public static final int SUMMER = 2;    public static final int AUTUMN = 3;    public static final int WINTER = 4;}
           

使用JUnit使用測試如下:

@Testpublic void noEnum() {  int i = 1;  Assert.assertTrue(Season.SPRING==i);}
           

使用接口靜态常量的方式比較難限定變量的範圍,而且定義繁瑣,功能也很有限,于是在Java 1.5 中定義了一個枚舉類型:java.lang.Enum。

Java枚舉的定義

類似類(class)和接口(interface)的定義,Java提供enum關鍵字用來定義枚舉類,在IDEA中建立枚舉類的菜單如下:

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

同樣定義一個季節的枚舉類, 代碼可以簡潔如下:

package cn.osxm.jcodef.func.base;public enum SeasonEnum {    SPRING, SUMMER, AUTUMN, WINTER}
           

在枚舉類中直接列出常量,常量遵循全部大寫的規則。在上面的枚舉類示例代碼中,SPRING, SUMMER, AUTUMN, WINTER 是SeasonEnum的成員。

枚舉成員預設是final、public、static (是以可以使用SeasonEnum.SPRING方式調用枚舉成員)

每一個枚舉類型成員都可以看作是枚舉類的執行個體 (SeasonEnum.SPRING的類型也是SeasonEnum)

在JUnit使用測試如下:

@Testpublic void enumBase() {    SeasonEnum season = SeasonEnum.SPRING;    Assert.assertTrue(season.equals(SeasonEnum.SPRING));}
           

Java 枚舉類的特性

Java枚舉類的特性有:

枚舉可以實作接口,但不能繼承接口,也不能被繼承;

枚舉類是final的,是以不能繼承;

枚舉類的構造方法是私有的;

枚舉成員是靜态、final和public;

枚舉成員是枚舉類的執行個體。

但是從上面SeasonEnum枚舉類的定義來看,完全看不出這些特性,這些特性是怎麼來的呢? 請看下面的原理探求。

Java枚舉類實作的原理探求

Java枚舉類型的奧秘就在編譯階段,枚舉類在編譯後會生成了一個擴充java.lang.Enum的類。這個可以通過JDK自帶的javap工具來反編譯生成的.class檔案。對上面的生成的SeasonEnum.class檔案進行反編譯,因為這個檔案的包路徑是cn\osxm\jcodef\func\base,是以在指令行使用如下指令:

javap -p cn\osxm\jcodef\func\base\SeasonEnum.class
           

·-p參數的意思是反編譯代碼中包含私有的方法, p是private的意思。

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

從控制台輸出的反編譯後的源碼可以看出:

· 自定義的枚舉類會自動繼承java.lang.Enum類

· 每個成員變量都會被轉換為 private static final的枚舉類型的執行個體

· 自動添加private的構造函數 從反編譯後的源碼就不難了解Enum的特性了。

注意:使用專門的Java反編譯工具,比如JD GUI、luyten等對Eumn進行反編譯的效果接近源碼的效果,無法看到繼承等特性,JD-GUI反編譯的效果和源碼時一緻的,這也說明使用JD GUI來進行實際的反編譯還是不錯的。

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

覺得有用的小夥伴可以分享出去

給更多需要的人看到哦~

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹
java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹
java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

END

java 包結構 枚舉類_幹貨Java枚舉類型enum用法和原理介紹

繼續閱讀