精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你真的會用枚舉嗎?

開發 前端
我們知道一個枚舉的定義非常簡單。如果只考慮其作為標識的場景,那么從實現成本來看,枚舉和 public static final 的傳統方式差不多,甚至前者還更簡單些。

今天我們來聊聊枚舉。你可能會想:枚舉那么簡單,有什么好討論的?

沒錯,枚舉確實是一個極為常見的知識點,常見到很多人會忽略它,而只關注它最簡單的用法。當然,這和枚舉誕生的初衷有關。在 JDK1.5 以前,那是個沒有枚舉的時代,人們通過 public static final 的常量來定義一些全局使用的標識。甚至到現在,枚舉已經誕生很長時間了,但仍有一些人在使用這種方案。而且,在 C 語言中也有類似的“宏”的概念,如果你只是用來做全局標識,那么枚舉的意義就沒有那么大了。

但是,你真的了解枚舉嗎?今天我們就分別從實現原理、數據結構和設計模式 3 個方向來重新認識一下枚舉。

枚舉原理

我們知道一個枚舉的定義非常簡單。如果只考慮其作為標識的場景,那么從實現成本來看,枚舉和 public static final 的傳統方式差不多,甚至前者還更簡單些。

public enum Test{
  A,B
}

每一個枚舉成員都可以看作是枚舉類的實例,上面的 Test.A 的類型也是 Test。

Test t=Test.A;

上面這個賦值語句看上去很簡單,仔細思考里面包含了幾層意思。首先左邊是 Test 類型的實例 t,那么右邊必然是一個類的實例。但是 Test.A 看上去像是一個類,這里很容易混淆。請注意,Test.A 是一個對象,不要被這里的大寫忽悠了,它不是類。

我們把這個枚舉翻譯成下面的樣子你是不是更熟悉?

Test A=new Test();
  Test B=new Test();

Java 枚舉類型的實現是在編譯階段進行的。這個階段和泛型的實現一樣,也就是說對 JVM 來說執行的字節碼集合并沒有增加任何新的指令,只是在 Java 代碼的層面加了一些語法。說白了,就是對已有的 JVM 指令集加了一層皮。

舉個生活化的例子,“進食”是人類最基本的行為,酒店會說“用餐”,但“用餐”是人體的新功能嗎?并不是。在計算機界這叫“語法糖”,看著很神奇,寫著也很爽,但底層還是老的功能。

我們可以對 Test.class 文件進行反編譯,注意反編譯命令是 javap,其中-p 的意思是反編譯的時候要包含私有方法。

javap -p Test.class

輸出結果為:

public final class Test extends java.lang.Enum<Test> {
   public static final Test A;
   public static final Test B;
   public static Test[] values();
   public static Test valueOf(java.lang.String);
   private Test();
   static {};
 }

我們可以看到,確實 A 和 B 都是 Test 類的實例。Test 繼承了 java.lang.Enum 類,這里還有一個 Test 的無參構造方法,這里的 A 和 B 分別使用這個構造方法來實例化。

而實例化的過程發生在哪呢?

我們注意到上面代碼段的最后有一個空的 static 語句塊,我們可以基于 javap 的其他參數進一步分析 static 里面的字節碼內容。static 里面其實包含了很多字節碼指令,正是這些指令在做 A、B 的初始化工作。而 static 代碼塊是在類加載的時候執行的。也就是說當 Test 被加載的時候,A、B 就被初始化了。

static 內部除了完成初始化 A、B,還創建了一個名叫 ENUM$VALUES 的數組,然后把 A、B 按照定義的順序放入這個數組中。最后我們可以通過 values 方法來訪問這個數組。

這里我們可以增加一個構造方法,這樣大家就比較熟悉了。A、B 后面可以加一個括號調用這個構造方法。

public enum Test{
  A("a"),B("b");
  Test(String name){
    this.name=name;
  }
  private String name;
}

上面 A(“a”) 相當于如下代碼的簡寫:

Test A=new Test("a");

我們再把例子做的復雜一些,我們為 Test 增加一個抽象方法 print。這里就不能像上面那樣直接初始化了。這里必須使用類似匿名內部類的寫法。

public enum Test{
  A("a"){
    @Override
    public void print(){
      System.out.print("a");
    }
  },
  B("b"){
    @Override
    public void print(){
      System.out.print("b");
    }
  };
  Test(String name){
    this.name=name;
  }
    private String name;
    public abstract void print();
}

上面這個寫法有點不倫不類,你需要適應一下。如果你去編譯目錄下查看文件,這次你會發現編譯后多了 Test和2.class 2 個文件,也就是匿名內部類。可見語法糖已經幫我們做好了一切。

數據結構

說完了枚舉的實現原理,我們再看看它支持的一些數據結構。常見的有 EnumSet 和 EnumMap。1.EnumSet

EnumSet 顯然是為枚舉打造的抽象集合類。它使用了位圖來存儲數據,因此非常緊湊。

EnumSet 有 2 個實現類,RegularEnumSet 和 JumboEnumSet。當我們創建 EnumSet 的時候,如果枚舉成員數量小于等于 64 將會使用 RegularEnumSet,大于 64 則會創建 JumboEnumSet。

為什么創建 EnumSet 的時候,會有不同的實現類呢?

這是因為 RegularEnumSet 采用 long 來存儲枚舉變量,而 long 是 64 位的,因此只能存儲 64 個變量。而 JumboEnumSet 使用 long[]來存儲枚舉變量,因此沒有這個限制。當然,你見過一個枚舉類超過 64 個成員變量嗎?如果真有這種情況,我認為放到 ZooKeeper 中會更合適一些。

這是一個很有意思的哲學問題,當你的枚舉變量只有 2 個,這個枚舉一般是很穩定的,但是你的枚舉變量超過了 64 個,我相信隨著業務發展枚舉數量還會新增,這種情況下就不適合用枚舉來解決了。也就是說枚舉變量越多,業務越不穩定。

EnumSet支持常見的集合操作,如取子集、增加、刪除、包含等。可以使用EnumSet的of方法來初始化。
EnumSet<Test> testSet = EnumSet.of(Test.A, Test.B);

2.EnumMap

EnumMap 很明顯是一個 Map 結構,它的 key 就是枚舉,value 可以由你定義。比如下面這個聲明的意思就是對所有的 Object 按照 Test 枚舉類型來分類。其結果是輸出類型 A 及屬于 A 類型的對象,輸出類型 B 及屬于 B 類型的對象。

EnumMap<Test,List<Object>> testMap;

設計模式

最后我們聊聊枚舉和設計模式的關系。

單例模式有很多實現方法,其中最好的就是用枚舉來實現。例如,下面的代碼段:

public enum Singleton{
        INSTANCE;
        private Singleton(){
            //做一些初始化工作
        }
    }

上面的 INSTANCE 就是我們的單例對象,我們可以把一些初始化工作放到 Singleton 的構造方法里面。還記得前面我們說的,枚舉的成員就是枚舉類的實例化對象,這個過程發生在 static 語句塊中。上面這段話所傳達的語義類似下面這樣:

Singleton INSTANCE=null;
static{
  INSTANCE = new Singleton();
}

此外枚舉在序列化和反序列化的時候并不會調用構造方法,這在一定程度上保障了單例。序列化僅僅是將枚舉對象的 name 屬性輸出到結果中,反序列化的時候則是通過 java.lang.Enum 的 valueOf 方法來根據名字查找枚舉對象。這里的處理和普通的類有很大的差異。

另外枚舉還可以實現模板模式、策略模式等。但是注意不要把太多代碼放到枚舉類,這樣不便于維護。關于用枚舉實現其他的設計模式讀者可以自己試試。

總結

上面就是枚舉的核心內容。我們知道枚舉本質上是一個語法糖,底層是通過繼承 java.lang.Enum 來實現的。枚舉的每個成員都是枚舉類的實例,并且還有自己的 Set 和 Map 數據結構,通過上面的分析我們可以看出枚舉底層實現很普通,但是很多語法特性超越了普通的 Java 類,在設計單例模式以及一些模板模式中將簡化編碼工作,使得工程整體變的更優雅、更緊湊。

責任編輯:武曉燕 來源: 程序員技術充電站
相關推薦

2018-09-29 15:34:34

JavaList接口

2020-06-04 14:15:55

Java中BigDecimal函數

2016-05-04 10:36:42

iossdwebimage開發

2023-12-01 11:13:50

JavaTreeSet

2021-11-29 09:45:57

枚舉Go代碼

2025-04-01 08:00:00

curl開發運維

2020-12-18 08:59:51

蘋果iCloud儲存照片

2024-12-27 09:29:09

2025-02-14 08:30:49

SpringJava開發

2016-06-01 15:42:58

Hadoop數據管理分布式

2021-08-11 10:00:51

緩存MyBatis管理

2025-01-20 00:00:00

反射Java語言

2021-09-06 10:42:18

Linux命令服務器

2020-04-17 14:25:22

Kubernetes應用程序軟件開發

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統數據庫

2021-11-09 09:48:13

Logging python模塊

2021-04-23 07:27:31

內存分配CPU

2021-01-15 07:44:21

SQL注入攻擊黑客

2022-08-15 10:42:50

千兆網絡千兆光纖
點贊
收藏

51CTO技術棧公眾號

国产精品国产三级国产普通话对白| 永久免费未满蜜桃| 免费的黄网站在线观看| 激情深爱一区二区| 98视频在线噜噜噜国产| www在线观看免费视频| 91精品店在线| 亚洲一区二区三区三| 久久一区免费| 国产一区二区小视频| 精品动漫一区| 深夜福利国产精品| 在线观看国产网站| 精品美女一区| 欧美日韩国产精品一区| 三年中文高清在线观看第6集| 天堂在线资源库| 精品在线免费视频| 日韩av成人在线| 激情五月婷婷小说| 成人精品天堂一区二区三区| 亚洲成人av片| 91大神免费观看| 99久久伊人| 欧美视频第一页| 中文精品无码中文字幕无码专区| 成年人免费在线视频| 北岛玲一区二区三区四区| 国产日韩中文在线| 伊人成年综合网| 国产欧美日韩综合一区在线播放 | 国产精品一二三产区| 国产精品成人在线观看| 青娱乐国产91| 日本成人一区二区三区| 国产馆精品极品| 91久久久久久久久久久久久| 97人妻一区二区精品视频| 91久久综合| 久久久亚洲影院你懂的| 天天看片中文字幕| 一区二区三区在线观看免费| 最近中文字幕2019免费| 美国黑人一级大黄| 国模吧精品视频| 亚洲视频专区在线| 美国黄色一级毛片| 九九在线精品| 精品亚洲永久免费精品| 亚洲男人在线天堂| 日韩三级av| 日韩av网站大全| 黄色av网址在线观看| 国产精品美女在线观看直播| 精品国产免费视频| 小毛片在线观看| 精品亚洲自拍| 亚洲免费一在线| 亚洲精品午夜视频| 一区二区三区视频免费观看| 亚洲人成在线观看网站高清| 天天躁日日躁aaaxxⅹ| 九九久久精品| 中文字幕视频在线免费欧美日韩综合在线看| 这里只有久久精品| 国产精品美女久久久久久不卡 | 九色91在线| 亚洲一区二区三区四区在线| 3d动漫一区二区三区| 色吧亚洲日本| 91精品办公室少妇高潮对白| 午夜激情av在线| 国产高清精品二区| 精品捆绑美女sm三区| 双性尿奴穿贞c带憋尿| 精品久久精品| 久久精品国产成人| 国产在线观看免费av| 一本久道综合久久精品| 国产精品久久久久免费a∨大胸| 亚洲一区二区三区高清视频| 国产精一区二区三区| 国产亚洲第一区| av在线电影免费观看| 亚洲另类在线视频| 国产在线观看福利| 日本综合视频| 日韩美一区二区三区| 久久久无码人妻精品一区| 日韩一区欧美| 久久全球大尺度高清视频| 亚洲天堂视频网站| 精品一区二区三区影院在线午夜| 国产伦精品一区二区三区视频黑人 | 日韩高清欧美高清| 中国美女黄色一级片| 精品69视频一区二区三区Q| 欧美一级免费看| 国产精品日韩无码| 97国产一区二区| 中文字幕乱码一区二区三区| 五月天国产在线| 欧美精品在线视频| 一区二区三区免费在线观看视频| 久久亚洲成人| 欧美在线一级视频| a级片免费观看| 国产午夜精品久久| 日韩美女爱爱视频| 日本亚洲欧洲无免费码在线| 亚洲精品美女久久久久| 欧美成人精品欧美一| 日本女人一区二区三区| 国产一区二区三区免费不卡| 日日夜夜精品一区| 一本色道综合亚洲| 亚洲午夜久久久久久久久| 99久久精品费精品国产风间由美 | 熟女视频一区二区三区| 在线观看精品| 亚洲国产精品美女| 国产67194| 奇米色777欧美一区二区| 久久国产精品高清| 青春草视频在线| 91麻豆精品国产无毒不卡在线观看| 国产精品亚洲无码| 亚洲区国产区| 国产麻豆乱码精品一区二区三区 | 亚洲午夜在线电影| 四虎1515hh.com| 91精品秘密在线观看| 国产精品日韩精品| 触手亚洲一区二区三区| 黑人巨大精品欧美一区二区一视频 | 久久久精品毛片| 91在线免费视频观看| 拔插拔插海外华人免费| 97se亚洲国产一区二区三区| 欧美成人精品一区二区| 国产尤物视频在线观看| 国产精品视频线看| 日本在线观看免费视频| 欧美丝袜激情| 国产精品美女久久久久av超清| 蜜桃视频在线免费| 色综合一个色综合亚洲| 在线观看国产三级| 国产精品美女久久久浪潮软件| 国产精品免费一区二区三区观看| 免费在线观看的电影网站| 日韩欧美国产精品一区| 亚洲色婷婷一区二区三区| 国产成人午夜高潮毛片| 亚洲色成人www永久在线观看| 综合视频一区| 欧美亚洲伦理www| 牛牛影视精品影视| 欧美在线视频不卡| 一二三四在线观看视频| 久久精品99久久久| 色乱码一区二区三区熟女| 国产精品毛片aⅴ一区二区三区| 日韩中文字幕免费看| 国产又粗又长视频| 一区二区三区在线影院| 艳妇乳肉豪妇荡乳xxx| 国产模特精品视频久久久久| 奇米影视首页 狠狠色丁香婷婷久久综合 | 亚洲一区二区三区不卡国产欧美| 四虎永久免费观看| 国产美女精品| 亚洲国产午夜伦理片大全在线观看网站| 成人午夜亚洲| 欧美区在线播放| 天天操天天操天天操| 日本韩国视频一区二区| 91高清免费看| www国产亚洲精品久久麻豆| 国产三级日本三级在线播放| 99久久婷婷国产综合精品电影√| 2019国产精品视频| 在线能看的av网址| 久久精品国产免费观看| 亚洲av永久无码国产精品久久| 精品国产乱码久久久久久天美 | 亚洲aⅴ男人的天堂在线观看| 国精一区二区三区| 国产亚洲视频在线| 性少妇videosexfreexxx片| 欧美日韩视频免费播放| 少妇高潮一区二区三区喷水| 成人av免费观看| av中文字幕网址| 在线亚洲自拍| 国产盗摄视频在线观看| 九九精品在线| 国产精品久久久久久久小唯西川 | 欧美日韩中文精品| 精品无码久久久久| 国产精品丝袜一区| 中文乱码人妻一区二区三区视频| 狠狠色丁香婷综合久久| 国产又大又硬又粗| 欧美日韩国产亚洲一区| 日韩精品久久久| 精品女人视频| 91精品综合久久| 成人国产在线| 欧美一级淫片aaaaaaa视频| www.欧美日本韩国| 在线观看欧美日韩| 偷拍自拍在线| 日韩精品一区二区三区老鸭窝| 亚洲天堂视频在线播放| 精品毛片网大全| 青青草激情视频| 国产精品乱人伦| 国内精品久久99人妻无码| 国产精品综合av一区二区国产馆| 高清一区二区视频| 欧美专区一区二区三区| 成熟丰满熟妇高潮xxxxx视频| 亚洲情侣在线| 亚洲欧美日韩精品在线| 蜜桃视频欧美| 狠狠色狠狠色综合人人| 国产精品qvod| 99porn视频在线| 97久久中文字幕| 国产欧美精品一区二区| 色综合亚洲图丝熟| 97精品欧美一区二区三区| 污片在线免费观看| 欧美另类在线观看| а天堂中文在线官网| 久久久www成人免费精品| 91.xxx.高清在线| 一区二区三区回区在观看免费视频| 精品亚洲综合| 精品中文视频在线| 三区在线视频| 亚洲精品二三区| 天天操天天爱天天干| 日韩精品在线免费| 青春有你2免费观看完整版在线播放高清| 亚洲精品国产精品国自产在线| 人妻精品一区二区三区| 精品国产sm最大网站免费看| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 好操啊在线观看免费视频| 久久天天躁夜夜躁狠狠躁2022| 亚洲视频tv| 日韩中文字幕视频| 天堂亚洲精品| 韩国美女主播一区| 色综合桃花网| 国产精品第10页| 亚洲色图图片| 国产精品免费观看高清| 自拍偷拍一区| 一区二区精品免费视频| 欧美一区影院| 久久99中文字幕| 日韩中文字幕1| 九九九九九伊人| 成人久久18免费网站麻豆| 欧美一区二区免费在线观看| 久久久综合精品| 天美传媒免费在线观看| 亚洲精品国产无天堂网2021| 国产乡下妇女做爰视频| 91福利视频网站| 99国产精品99| 亚洲男人天堂2019| 2021av在线| 久久久久久久久久久久久久久久久久av| 老色鬼在线视频| 国产欧美精品在线| 久久久久97| 亚洲一区在线免费| 亚洲毛片播放| jizz大全欧美jizzcom| 岛国一区二区在线观看| 亚洲AV无码成人精品区明星换面 | 日本一区二区免费电影| 欧美男人的天堂一二区| 日本黄色大片视频| 色偷偷av一区二区三区| sm在线观看| 国产欧美日韩丝袜精品一区| 国产图片一区| 亚洲精品成人a8198a| 91久久中文| www.久久com| 国产清纯美女被跳蛋高潮一区二区久久w| 午夜精品福利在线视频| 日韩欧美在线免费| www.天天干.com| 中文字幕久久亚洲| 欧美gv在线| 999精品视频一区二区三区| 国产毛片一区二区三区| 97久久国产亚洲精品超碰热| 日本va欧美va精品| 7788色淫网站小说| 亚洲日本在线视频观看| 精品国产xxx| 亚洲国产精品久久久久久| 黄色在线免费网站| 国产精品99久久久久久久久久久久 | 亚洲av熟女国产一区二区性色| 亚洲v中文字幕| 国产视频一区二区三区四区五区| 国产一区二区三区在线免费观看 | 性色av蜜臀av色欲av| 亚洲欧美精品午睡沙发| 中文字幕av免费观看| 日韩精品亚洲视频| 女子免费在线观看视频www| 国产一区深夜福利| 国产成人1区| 国产黄色特级片| 99re热视频精品| 中文在线观看免费网站| 日韩午夜在线播放| 精品自拍一区| 成人免费在线视频网站| 日韩久久视频| 麻豆三级在线观看| 国产欧美一区二区精品婷婷| 亚洲精品男人的天堂| 亚洲国产精品嫩草影院| 91久久精品国产91性色| 亚洲AV无码国产成人久久| 欧美日韩视频免费看| 黄色成人在线免费| 手机成人av在线| www.av在线| av中文字幕在线不卡| 成人精品在线观看| 在线观看日本视频| 亚洲久色影视| 久久视频免费在线播放| japanese在线观看| 精品动漫3d一区二区三区免费版| 手机在线观看日韩av| 国产精品久久久久久久第一福利| 成人一级免费视频| 中文字幕日韩欧美| 四虎永久精品在线| 神马午夜伦理影院| 国产成人在线影院 | 国产亚洲电影| 欧美亚洲日本在线观看| 国产亚洲欧美日韩在线一区| 这里只有精品免费视频| 社区色欧美激情 | 国产精品**亚洲精品| av一区二区三区免费观看| 成人aaaa免费全部观看| www亚洲视频| 国产亚洲欧美视频| 只有精品亚洲| 亚洲国产精品成人天堂| 久久久综合网站| 国产一区二区在线视频聊天| 欧美日韩国产91| 日韩免费电影在线观看| 杨幂毛片午夜性生毛片| 亚洲天堂精品视频| 免费观看黄一级视频| 欧美一性一乱一交一视频| 精品久久久久久久| 少妇丰满尤物大尺度写真| 婷婷一区二区三区| 国产高清免费av在线| 91亚洲精品在线观看| 99热这里只有成人精品国产| 久久久久亚洲av无码a片| 欧美剧情片在线观看| www555久久| 欧美专区一二三| 国产盗摄精品一区二区三区在线| 国产午夜激情视频| 在线观看日韩av| 草草视频在线一区二区| 香蕉视频网站入口| 一区二区成人在线观看| 国产高清视频在线观看| 99中文字幕| 日本午夜一本久久久综合| 免费人成年激情视频在线观看| 国产一区二区黑人欧美xxxx| 精品一区二区三区四区五区| 能看的毛片网站| 午夜视频在线观看一区二区三区| 欧美极品视频| 欧美日韩亚洲综合一区二区三区激情在线 | 亚洲精品字幕在线观看|