java 枚举_Java中的枚举类型(Enum)详解
程序員工作久了便可能整日忙碌于“增刪改查”中,迷失方向,毫無進步。
該公眾號致力于分享軟件開發相關的原創干貨,助你完成從程序員到架構師的進階之路!
努力!做一個NB的Coder!
1 枚舉類型初探
枚舉類型,其語法總讓人覺著怪怪的,如下:
簡單的一行,就定義了包含四個值的枚舉類型,缺總讓人覺著語法有點怪異。而在使用時:
就可以得到輸出:
那我們簡單的一行定義中,到底發生了什么?枚舉類型在編譯時是怎樣實現的?它還有著怎樣的特點?
我們將會分幾節對Java中的枚舉類型進行介紹。
2 枚舉產生之前
如果不使用枚舉,我們要對“春夏秋冬”這四個值分別賦予一個數字,則常見的操作為:
上述方法定義十分繁瑣,而且容易出錯。例如我們定義的int數字出現重復,編譯器也不會給出任何的警示。同時,這樣的操作是實在太頻繁了,最終Java 5中增加了枚舉類型。
而是用枚舉類型后,一切就變成了如下所示的簡單幾行:
而且,Java自動給按照枚舉值出現的順序,從0開始分配了編號。通過name()可以獲得枚舉值的名稱,通過ordinal()可以獲得枚舉值的編號。
3 枚舉實現原理
那我們定義枚舉類型后,到底發生了什么呢?我們對枚舉的實現原理進行探究。
首先,我們在實現Season枚舉類時,并沒有定義name()和ordinal()方法。我們從這里入手,點擊該方法后,發現進入了一個抽象類:
并且,我們發現編譯器不允許我們自行實現該抽象類從而構造一個新的類。但是,既然我們的Season枚舉類可以調用其中的方法,因此Season枚舉類應該是繼承了該抽象類。
為了驗證這一猜想,我們讓Season類繼承一個其他的類,發現果然不可以,因為Java是不允許多繼承的。
具體,我們對Season類進行反編譯,即:java -p Season.class,得到反編譯后的結果:
我們看到,對與枚舉類,有很多值的注意的點:
- 枚舉類在經過編譯后確實是生成了一個擴展了java.lang.Enum的類
- 枚舉類是final的,因此我們無法再繼承它了
- 我們定義的每個枚舉值都是該類中的一個成員,且成員的類型仍然是Season類型
- 枚舉類中被默認增加了許多靜態方法,例如values()等
為了進一步了解每個方法中的操作,我們使用java -p -c Season.class每個方法中的字節碼:
根據字節碼,我們還原其操作代碼,大致如下:
注意:以下代碼為筆者自己翻譯,如果有好的字節碼查看工具請一定要留言告訴我啊。通過這里我們可以看到,在類的static操作中,編譯器幫助我們生成每個枚舉值的對象。
4 總結
我們在總結一下,我們使用enum定義的枚舉類型,會在編譯之后轉化為一個繼承了java.lang.Enum的類,而我們定義的每個枚舉值都會在類的初始化階段被實例化為我們所定義的枚舉類的一個對象。
同時,編譯器還幫我們在類中增加了兩個方法,分別是:values()和valueOf()。
至此,我們對Java的枚舉對象有了徹底的認識。
但是,我們依舊有著很多的疑惑:
- 編譯器插入的方法和正常的方法有無不同
- 枚舉類型還有哪些使用上的注意點,例如相關方法和操作
- 枚舉類型的實現上還有哪些特殊之處
這些,我們在接下來的文章中繼續分析。
—END—
建議:原創不易,請 贊同 后再收藏!
分享讓你從程序員進階架構師的原創干貨!
歡迎關注我,不錯過每期的原創干貨!
總結
以上是生活随笔為你收集整理的java 枚举_Java中的枚举类型(Enum)详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos7 界面中文都是方块_Cen
- 下一篇: 如何把class里的vector结构体m