Java中的Enum枚舉使用方法解析
一、為什么需要枚舉
舉個(gè)例子,生物界性別分“雄性”、“雌性”和“中性”,將其定義為靜態(tài)常量:
public class Gender{
public static final int Male = 1;
public static final int Female = 2;
public static final int Neutral = 3;
}
對(duì)于這種單值類型的靜態(tài)常量定義,本身也沒錯(cuò),主要是在使用的地方?jīng)]有一個(gè)明確性的約束而已,比如這里的 judgeGender 方法的本意是傳入 Gender 的三種靜態(tài)常量之一,但由于沒有類型上的約束,因此傳入任意一個(gè) int 值都是可以的,編譯器也不會(huì)提出任何警告。
void judgeGender(int code){}
但是在枚舉類型出現(xiàn)之后,上面這種情況就可以用枚舉嚴(yán)謹(jǐn)?shù)厝ゼs束,比如用枚舉去定義性別就非常簡(jiǎn)潔了:
public enum Gender {
Male, Female, Neutral
}
而且主要是在用枚舉的地方會(huì)有更強(qiáng)的類型約束。如下入?yún)㈩愋途蜁?huì)受到明確的類型約束,一旦傳入無效值,編譯器就會(huì)幫檢查,從而規(guī)避潛在問題。除此之外,枚舉在擴(kuò)展性方面比普通常量更方便、也更優(yōu)雅。
//入?yún)⒕拖薅祟愋?
void judgeGender(Gender gender){}
綜上,枚舉的意義:
- 封裝有限的變化,提高代碼維護(hù)性,確保變量合法。 如果利用 int 類型表示星期一到星期日的話,就要判斷輸入 int 變量不在 1-7 的范圍內(nèi)的情況。
- 代碼更優(yōu)雅,提高代碼可讀性。一個(gè)復(fù)制的程序里面,可能要用到成百上千的靜態(tài)常量,如果全寫在一個(gè)文件里面,容易造成命名混淆,程序讀起來也比較麻煩。
二、單值枚舉
定義一個(gè)性別枚舉:
public enum Gender {
Male, Female, Neutral
}
枚舉的所有基本用法:
public class judgeGender {
public static void main(String[] args) {
for (Gender genderType : Gender.values()) {
System.out.println(genderType);
}
Gender male = Gender.Male;
Gender female = Gender.Female;
Gender neutral = Gender.Neutral;
System.out.println(male.ordinal());//0
System.out.println(female.ordinal());//1
System.out.println(neutral.ordinal());//2
System.out.println(male.name());//Male
System.out.println(female.name());//Female
System.out.println(neutral.name());//Neutral
System.out.println(male.compareTo(male));//0
System.out.println(male.compareTo(female));//-1
System.out.println(female.compareTo(neutral));//-1
System.out.println(Gender.valueOf("Male"));//Male
System.out.println(Gender.valueOf("Female"));//Female
System.out.println(Gender.valueOf("Neutral"));//Neutral
Gender gender = Gender.Male;
switch (gender) {
case Male:
System.out.println("男");
break;
case Female:
System.out.println("女");
break;
case Neutral:
System.out.println("中性");
break;
}//男
}
}
三、多值枚舉
上面展示的枚舉例子非常簡(jiǎn)單,僅僅是單值的情形,而實(shí)際項(xiàng)目中用枚舉往往是多值用法。擴(kuò)充一下上面的 Gender 枚舉,在里面加入 【說明 – 編碼】的對(duì)應(yīng)關(guān)系,這也是實(shí)際項(xiàng)目中常用的用法??梢栽诿杜e里自定義各種屬性、構(gòu)造函數(shù)、甚至各種方法:
public enum GenterType {
Male("男", "01"),
Female("女", "02"),
Neutral("中性", "03"),
;
//自定義屬性
private final String explain;
private final String code;
public String getExplain() {
return explain;
}
public String getCode() {
return code;
}
//自定義構(gòu)造函數(shù)
GenterType(String explain, String code) {
this.explain = explain;
this.code = code;
}
}
從上述代碼可知,在 enum 枚舉類中完全可以像在普通 Class 里一樣聲明屬性、構(gòu)造函數(shù)以及成員方法。
四、專門用于枚舉的集合類
一般習(xí)慣于使用諸如:HashMap 和 HashSet 等集合來盛放元素。而對(duì)于枚舉,有專門的集合類: EnumSet 和 EnumMap
- EnumSet
EnumSet 是專門為盛放枚舉類型所設(shè)計(jì)的 Set 類型。
- EnumMap
EnumMap 則是用來專門盛放枚舉類型為 key 的 Map 類型。
到此這篇關(guān)于Java中的Enum枚舉使用方法解析的文章就介紹到這了,更多相關(guān)Java中的Enum枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java觀察者模式實(shí)現(xiàn)和java觀察者模式演化
觀察者模式是經(jīng)典設(shè)計(jì)模式中很常用的一種,平常我們看到的監(jiān)聽器,基本上都是采用這種設(shè)計(jì)模式實(shí)現(xiàn)的,這里探討一下觀察者模式的演化2014-02-02
Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例
Spring?Validation其實(shí)就是對(duì)Hibernate?Validator進(jìn)一步的封裝,方便在Spring中使用,這篇文章主要介紹了Spring?Validation實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)的示例,需要的朋友可以參考下2023-03-03
深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題
這篇文章主要介紹了深入學(xué)習(xí)Spring Boot排查 @Transactional 引起的 NullPointerException問題,需要的朋友可以參考下2018-01-01
淺談MyBatis-Plus學(xué)習(xí)之Oracle的主鍵Sequence設(shè)置的方法
這篇文章主要介紹了淺談MyBatis-Plus學(xué)習(xí)之Oracle的主鍵Sequence設(shè)置的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java多線程提交按照時(shí)間順序獲取線程結(jié)果詳解流程
在工作中是否存在這樣的場(chǎng)景,多個(gè)線程提交執(zhí)行,你不想全部線程執(zhí)行結(jié)束了獲取結(jié)果,而是有線程完成返回結(jié)果就獲取消費(fèi)。本文提供該場(chǎng)景的工具類,可以直接用哦2021-11-11
Mybatis框架之工廠模式(Factory Pattern)
MyBatis中使用工廠模式來管理和創(chuàng)建SqlSession對(duì)象,從而簡(jiǎn)化數(shù)據(jù)庫(kù)訪問的配置和管理過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
詳解spring cloud hystrix請(qǐng)求緩存(request cache)
這篇文章主要介紹了詳解spring cloud hystrix請(qǐng)求緩存(request cache),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
SpringBoot?基于?MongoTemplate?的工具類過程詳解
MongoDB是一個(gè)高性能,開源,無模式的文檔型數(shù)據(jù)庫(kù),是當(dāng)前NoSql數(shù)據(jù)庫(kù)中比較熱門的一種,這篇文章主要介紹了SpringBoot基于MongoTemplate的工具類,需要的朋友可以參考下2023-09-09

