摘要:枚舉的實現原理通過使用反編譯命令我們可以得出一下結論編譯器將枚舉類型編譯為類型的類。由以上三點確保了枚舉的特性之一枚舉類型所具有的值是不可變的而枚舉的另一個特性具有所有的值則是由程序員來實現。
定義
一個事物的所有值的集合。
枚舉類型的屬性
??因為枚舉類型所代表的是一個事物的所有值的集合,所以枚舉類型應具有的屬性為:
枚舉類型所具有的值是不可變的。
具有所有的值
枚舉的作用限定值的范圍,通??梢杂脕硐拗平涌诘膮档娜≈捣秶?。枚舉的實現原理
??通過使用反編譯命令javap我們可以得出一下結論:
編譯器將枚舉類型編譯為final類型的class類。
枚舉中的每一個枚舉值編譯為“public static final 類型 枚舉值”的形式。
編譯器編譯之后增加了一個靜態塊,在此靜態塊中創建一個新的對象并將此對象賦值給第2點中的靜態對象。
??由以上三點確保了枚舉的特性之一:枚舉類型所具有的值是不可變的
??而枚舉的另一個特性具有所有的值則是由程序員來實現。
使用javap -c 反編譯結果為:
public final class Season extends java.lang.Enum{ public static final Season SPIRNG; public static final Season SUMMER; public static final Season AUTUMN; public static final Season WINTER; public static Season[] values(); Code: 0: getstatic #1 // Field $VALUES:[LSeason; 3: invokevirtual #2 // Method "[LSeason;".clone:()Ljava/lang/Object; 6: checkcast #3 // class "[LSeason;" 9: areturn public static Season valueOf(java.lang.String); Code: 0: ldc #4 // class Season 2: aload_0 3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; 6: checkcast #4 // class Season 9: areturn static {}; Code: 0: new #4 // class Season 3: dup 4: ldc #7 // String SPIRNG 6: iconst_0 7: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 10: putstatic #9 // Field SPIRNG:LSeason; 13: new #4 // class Season 16: dup 17: ldc #10 // String SUMMER 19: iconst_1 20: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 23: putstatic #11 // Field SUMMER:LSeason; 26: new #4 // class Season 29: dup 30: ldc #12 // String AUTUMN 32: iconst_2 33: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 36: putstatic #13 // Field AUTUMN:LSeason; 39: new #4 // class Season 42: dup 43: ldc #14 // String WINTER 45: iconst_3 46: invokespecial #8 // Method " ":(Ljava/lang/String;I)V 49: putstatic #15 // Field WINTER:LSeason; 52: iconst_4 53: anewarray #4 // class Season 56: dup 57: iconst_0 58: getstatic #9 // Field SPIRNG:LSeason; 61: aastore 62: dup 63: iconst_1 64: getstatic #11 // Field SUMMER:LSeason; 67: aastore 68: dup 69: iconst_2 70: getstatic #13 // Field AUTUMN:LSeason; 73: aastore 74: dup 75: iconst_3 76: getstatic #15 // Field WINTER:LSeason; 79: aastore 80: putstatic #1 // Field $VALUES:[LSeason; 83: return }
源代碼:
public enum Season { SPIRNG, SUMMER, AUTUMN, WINTER; }
由于枚舉類型使用static塊來進行初始化,所以枚舉類型僅僅在每次類加載的時候初始化,這種特性可以用來實現單例模式參考我的另外一篇文章單例模式
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77693.html
摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...
摘要:枚舉是聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。注意枚舉只是枚舉類型,不能夠賦值操作。 枚舉類型是Java 5中新增特性的一部分,它是一種特殊的數據類型,之所以特殊是因為它既是一種類(class)類型卻又比類類型多了些特殊的約束,但是這些約束的存在也造就了枚舉類型的簡潔性、安全性以及便捷性。△有的地方還沒有學的透徹,之后會繼續學習修改更新本文章 1.枚...
摘要:常量接口是對接口的一種不良使用。如果這些常量最好被看作是枚舉類型成員,那就應該用枚舉類型來導出。因為客戶端既不能創建枚舉類型的實例,也不能對它進行擴展,因此很可能沒有實例,而只有聲明過的枚舉常量。換句話說,枚舉類型是實例受控的。 問題 我們偶爾能在項目中看到如下風格的代碼: public class ResponseCode { public static final int ...
摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...
閱讀 3056·2021-10-12 10:12
閱讀 5375·2021-09-26 10:20
閱讀 1523·2021-07-26 23:38
閱讀 2812·2019-08-30 15:54
閱讀 1643·2019-08-30 13:45
閱讀 1962·2019-08-30 11:23
閱讀 3085·2019-08-29 13:49
閱讀 830·2019-08-26 18:23