国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java枚舉實現原理

baishancloud / 1212人閱讀

摘要:枚舉的實現原理通過使用反編譯命令我們可以得出一下結論編譯器將枚舉類型編譯為類型的類。由以上三點確保了枚舉的特性之一枚舉類型所具有的值是不可變的而枚舉的另一個特性具有所有的值則是由程序員來實現。

定義
一個事物的所有值的集合。

枚舉類型的屬性

??因為枚舉類型所代表的是一個事物的所有值的集合,所以枚舉類型應具有的屬性為:

枚舉類型所具有的值是不可變的。

具有所有的值

枚舉的作用
限定值的范圍,通??梢杂脕硐拗平涌诘膮档娜≈捣秶?。
枚舉的實現原理

??通過使用反編譯命令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

相關文章

  • Java 總結

    摘要:中的詳解必修個多線程問題總結個多線程問題總結有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升有哪些源代碼看了后讓你收獲很多,代碼思維和能力有較大的提升開源的運行原理從虛擬機工作流程看運行原理。 自己實現集合框架 (三): 單鏈表的實現 自己實現集合框架 (三): 單鏈表的實現 基于 POI 封裝 ExcelUtil 精簡的 Excel 導入導出 由于 poi 本身只是針對于 ...

    caspar 評論0 收藏0
  • Javag工程師成神之路(2019正式版)

    摘要:結構型模式適配器模式橋接模式裝飾模式組合模式外觀模式享元模式代理模式。行為型模式模版方法模式命令模式迭代器模式觀察者模式中介者模式備忘錄模式解釋器模式模式狀態模式策略模式職責鏈模式責任鏈模式訪問者模式。 主要版本 更新時間 備注 v1.0 2015-08-01 首次發布 v1.1 2018-03-12 增加新技術知識、完善知識體系 v2.0 2019-02-19 結構...

    Olivia 評論0 收藏0
  • Java枚舉類學習到進階

    摘要:枚舉是聲明一組命名的常數,當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。注意枚舉只是枚舉類型,不能夠賦值操作。 枚舉類型是Java 5中新增特性的一部分,它是一種特殊的數據類型,之所以特殊是因為它既是一種類(class)類型卻又比類類型多了些特殊的約束,但是這些約束的存在也造就了枚舉類型的簡潔性、安全性以及便捷性。△有的地方還沒有學的透徹,之后會繼續學習修改更新本文章 1.枚...

    Juven 評論0 收藏0
  • 簡談Java Enum

    摘要:常量接口是對接口的一種不良使用。如果這些常量最好被看作是枚舉類型成員,那就應該用枚舉類型來導出。因為客戶端既不能創建枚舉類型的實例,也不能對它進行擴展,因此很可能沒有實例,而只有聲明過的枚舉常量。換句話說,枚舉類型是實例受控的。 問題 我們偶爾能在項目中看到如下風格的代碼: public class ResponseCode { public static final int ...

    BicycleWarrior 評論0 收藏0
  • Java 基礎 | Collection 集合概覽

    摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...

    codergarden 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<