Java中enum枚舉類(lèi)型的基本特性詳解
enum枚舉類(lèi)型的基本特性
enum關(guān)鍵字用于創(chuàng)建一個(gè)新類(lèi)型,其中包含一組數(shù)量有限的命名變量,并視這些變量為常規(guī)程序組件。實(shí)踐表明這是一種非常有用的類(lèi)型
你可以調(diào)用枚舉類(lèi)型中的 values() 方法來(lái)遍歷枚舉常量列表。values() 方法生成一個(gè)由枚舉常量組成的數(shù)組,其中常量的順序和常量聲明的順序保持一致,這樣你就可以方便地(比如通過(guò)for-in循環(huán))使用結(jié)果數(shù)組了。
當(dāng)創(chuàng)建枚舉類(lèi)型時(shí),編譯器會(huì)為你生成一個(gè)輔助類(lèi),這個(gè)類(lèi)自動(dòng)繼承自java.lang.Enum。java.lang.Enum提供了下例所示的一些功能:
EnumClass.java
enum Shrubbery {GROUND, CRAWLING, HANGING} public class EnumClass { public static void main(String[] args) { for (Shrubbery s : Shrubbery.values()) { System.out.println(s + " ordinal: " + s.ordinal()); System.out.print(s.compareTo(Shrubbery.CRAWLING) + " "); System.out.print(s.equals(Shrubbery.CRAWLING) + " "); System.out.println(s == Shrubbery.CRAWLING); System.out.println(s.getDeclaringClass()); System.out.println(s.name()); System.out.println("********************"); } // Produce an enum value from a String name: for (String s : "HANGING CRAWLING GROUND".split(" ")) { Shrubbery shrub = Enum.valueOf(Shrubbery.class, s); System.out.println(shrub); } } }
運(yùn)行結(jié)果:
ordinal() 方法返回一個(gè)從0開(kāi)始的int值,代表每個(gè)枚舉實(shí)例的聲明順序。你可以放心地使用 == 來(lái)比較枚舉實(shí)例( equals() 和 hashCode() 方法會(huì)由編譯器自動(dòng)為你生成)。Enum 類(lèi)實(shí)現(xiàn)了 Comparable 接口(因此可比較), 所以自動(dòng)包含了 compareTo() 方法,另外它還實(shí)現(xiàn)了 Serializable 接口(因此可序列化)。
如果調(diào)用枚舉實(shí)例的 getDeclaringClass()方法,則會(huì)得到該枚舉實(shí)例所屬的外部包裝類(lèi)。
name() 方法返回枚舉實(shí)例被聲明的名稱(chēng),使用 toString() 同樣也可以返回該名稱(chēng)。 value0f() 方法是 Enum 類(lèi)中的靜態(tài)方法,它根據(jù)傳入的 String, 返回名稱(chēng)與該 String 匹配的枚舉實(shí)例。如果匹配的實(shí)例不存在,則拋出異常。
靜態(tài)導(dǎo)入枚舉類(lèi)型
下面是基礎(chǔ)卷第 6 章中 Burrito.java 類(lèi)的一個(gè)變體:
SpicinessEnum.java
public enum SpicinessEnum { NOT, MILD, MEDIUM, HOT, FLAMING }
Burrito2.java
public class Burrito2 { SpicinessEnum degree; public Burrito2(SpicinessEnum degree) { this.degree = degree; } @Override public String toString() { return "Burrito is " + degree; } public static void main(String[] args) { System.out.println(new Burrito2(NOT)); System.out.println(new Burrito2(MEDIUM)); System.out.println(new Burrito2(HOT)); } }
運(yùn)行結(jié)果:
Burrito is NOT
Burrito is MEDIUM
Burrito is HOT
static import 將所有的枚舉實(shí)例標(biāo)識(shí)符都引入了本地命名空間,因此它們不需要顯式地使用枚舉類(lèi)型來(lái)限定。相較于顯式地用枚舉類(lèi)型來(lái)限定枚舉實(shí)例,哪種方式更好呢?這很大程度上要視代碼的復(fù)雜程度而定。編譯器肯定會(huì)保障類(lèi)型的正確性,所以你唯一要關(guān)心的就是代碼的可讀性如何。一般來(lái)說(shuō)不會(huì)有大問(wèn)題,但還是要根據(jù)具體情況評(píng)估。
注意,如果枚舉定義在同一個(gè)文件中,或者定義在默認(rèn)包中,則無(wú)法使用該方式(顯然在Sun公司的內(nèi)部,對(duì)于是否允許這種情況有過(guò)一些爭(zhēng)論)。
到此這篇關(guān)于Java中enum枚舉類(lèi)型的基本特性詳解的文章就介紹到這了,更多相關(guān)enum枚舉類(lèi)型的基本特性?xún)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring中@ComponentScan自動(dòng)掃描并指定掃描規(guī)則
本文主要介紹了spring中@ComponentScan自動(dòng)掃描并指定掃描規(guī)則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04基于IDEA創(chuàng)建SpringMVC項(xiàng)目流程圖解
這篇文章主要介紹了基于IDEA創(chuàng)建SpringMVC項(xiàng)目流程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例
下面小編就為大家?guī)?lái)一篇java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03Spring Boot自定義Banner實(shí)現(xiàn)代碼
這篇文章主要介紹了Spring Boot自定義Banner實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄
這篇文章主要介紹了關(guān)于SpingMVC的<context:component-scan>包掃描踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03淺析EasyExcel如何導(dǎo)出自動(dòng)回顯中文
這篇文章主要為大家詳細(xì)介紹了EasyExcel如何通過(guò)全局轉(zhuǎn)換器和自定義注解實(shí)現(xiàn)導(dǎo)出自動(dòng)回顯中文,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04BeanDefinitionRegistryPostProcessor如何動(dòng)態(tài)注冊(cè)Bean到Spring
這篇文章主要介紹了BeanDefinitionRegistryPostProcessor如何動(dòng)態(tài)注冊(cè)Bean到Spring,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03