深入學(xué)習(xí)java枚舉的應(yīng)用
一.枚舉和靜態(tài)常量區(qū)別
講到枚舉我們首先思考,它和public static final String 修飾的常量有什么不同。
我舉枚舉的兩個(gè)優(yōu)點(diǎn):
1. 保證了類型安全:調(diào)用者無(wú)法隨意傳一個(gè) int或者String 等值;
2.代碼可讀性非常高;
舉個(gè)例子:
在實(shí)際編程中,往往存在著這樣的“數(shù)據(jù)集”,它們的數(shù)值在程序中是穩(wěn)定的,而且“數(shù)據(jù)集”中的元素是有限的。例如春夏秋冬四個(gè)數(shù)據(jù)元素組成了四季的“數(shù)據(jù)集”。
你寫(xiě)了方法get(String season),輸入的類型只能是String類型,同時(shí)要String只能是(春、夏。秋。冬)。
這個(gè)時(shí)候。你寫(xiě)四個(gè)字符串常量
public class Common { public static final String SPRING="春"; public static final String SEASON="夏"; public static final String SUMMER="秋"; public static final String AUTUMN="冬"; }
在get方法里放入get(Common.SEASON),確實(shí)是把"春",放進(jìn)去了,但是這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)這里面有一個(gè)隱患,你get(String season),畢竟放入的是String類型的,如果新同事或者不知情的同事,不知道這個(gè)方法里只能放“春、夏、秋、冬”,它放了個(gè)其期它字符串比如get("小小“),這個(gè)時(shí)候,在編譯期它是不會(huì)報(bào)錯(cuò)的,只有運(yùn)行之后,才發(fā)現(xiàn)錯(cuò)了。
為了防止上面的隱患,枚舉出現(xiàn)了
public enum Season { SPRING("春"), SUMMER("夏"), AUTUMN("秋"), WINTER("冬"); ..... }
這個(gè)時(shí)候,我們修改get方法的傳參,改成get(Season season) 這個(gè)時(shí)候加入get(Season.SPRING),這就能保證傳入的參數(shù)只能是這幾個(gè)。
二.理解枚舉
首要我們要明確,其實(shí)枚舉也是個(gè)class類,我寫(xiě)個(gè)枚舉來(lái)理解。
//我們把枚舉當(dāng)做一個(gè)普通類 public enum Season { SPRING(1,"春"), SUMMER(2,"夏" ), AUTUMN(3,"秋" ), WINTER(4,"冬"); //這里最后一個(gè)一定要分號(hào),否則報(bào)錯(cuò) /*我們可以理解成 *public static final Season SPRING = new Season(1,春); *public static final Season SUMMER = new Season(2,夏); *public static final Season AUTUMN = new Season(3,秋); *public static final Season WINTER = new Season(4,冬); *既然是對(duì)象,那下面就很好理解了 */ /* * 1.上面對(duì)象里放了兩個(gè)參數(shù),那下面就肯定要有這個(gè)類型的構(gòu)造函數(shù) * 2.這里是private,因?yàn)椴荒茉诒籲ew對(duì)象了 */ private Season(int code,String name) { this.name = name; this.code = code; } //對(duì)象的屬性 private String name; private int code; //獲取對(duì)象屬性的方法 public String getName() { return this.name; } public String getCode() { return this.name; } //通過(guò)code獲得對(duì)象,我們就可以獲得對(duì)象的其它屬性 public static Season decode(int code) { Season season = null; for (Season type : Season.values()) { if (type.code==code) { season = type; break; } } return season; } //重新toString方法 public String toString() { return this.name; } }
上面這個(gè)例子,就很好解釋了枚舉,它和普通類沒(méi)什么區(qū)別,只是用另一種寫(xiě)法創(chuàng)建了幾個(gè)有屬性的對(duì)象,這也必須寫(xiě)這樣有屬性的構(gòu)造函數(shù),僅此而已。
這里順便列舉下枚舉的一些特點(diǎn):
1.它不能有public的構(gòu)造函數(shù),這樣做可以保證客戶代碼沒(méi)有辦法新建一個(gè)enum的實(shí)例。
2. 枚舉不能在繼承其它類了,因?yàn)樗J(rèn)繼承了java.lang.Enum
3. 常量值地址唯一,可以用==直接對(duì)比,性能會(huì)有提高.
4.Enum還提供了values方法,這個(gè)方法使你能夠方便的遍歷所有的枚舉值。
5.Enum還有一個(gè)oridinal的方法,這個(gè)方法返回枚舉值在枚舉類種的順序,這個(gè)順序根據(jù)枚舉值聲明的順序而定。
三.枚舉的常見(jiàn)用法
第一種:switch運(yùn)用
先建一個(gè)枚舉:
public enum Common { INSERT, MODIFY, DELETE } //因?yàn)檫@里是無(wú)參的對(duì)象,所以可以用系統(tǒng)默認(rèn)的構(gòu)造函數(shù)。也不用寫(xiě)屬性和方法。
在寫(xiě)實(shí)現(xiàn)代碼
public class CommonUtils { public static void getType(Common common){ Common c=common; switch(c) { case INSERT: System.out.println("進(jìn)行插入操作"); break; case MODIFY: System.out.println("進(jìn)行修改操作"); break; case DELETE: System.out.println("進(jìn)行刪除操作"); break; } } public static void main(String[] args) { getType(Common.DELETE); //后臺(tái)輸出:進(jìn)行刪除操作 } }
第二種用法,通過(guò)key值獲得value值獲取其它值
枚舉類
public enum Season { SPRING(1,"春","春天放風(fēng)箏"), SUMMER(2,"夏","夏天去游泳"), AUTUMN(3,"秋","秋天去秋游"), WINTER(4,"冬","冬天吃火鍋"); private Season(int code,String name,String bz) { this.code = code; this.name = name; this.bz=bz; } private int code; private String name; private String bz; public static Season decode(int code) { Season season = null; for (Season type : Season.values()) { if (type.code==code) { season = type; break; } } return season; } public int getCode() { return code; } public String getName() { return name; } public String getBz() { return bz; } }
測(cè)試類
好了,就寫(xiě)這么多,以后有需要會(huì)更深入了解。感謝大家對(duì)腳本之家的支持。
相關(guān)文章
Spring?MVC策略模式之MethodArgumentResolver源碼解析
這篇文章主要為大家介紹了Spring?MVC策略模式之MethodArgumentResolver源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java實(shí)現(xiàn) 微博登錄、微信登錄、qq登錄實(shí)現(xiàn)代碼
這篇文章主要介紹了java實(shí)現(xiàn) 微博登錄、微信登錄、qq登錄實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10SpringBoot應(yīng)用部署于外置Tomcat容器的方法
這篇文章主要介紹了SpringBoot應(yīng)用部署于外置Tomcat容器的方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06

JAXB簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

Spring?Security配置多個(gè)數(shù)據(jù)源并添加登錄驗(yàn)證碼的實(shí)例代碼

使用SpringBoot請(qǐng)求參數(shù)過(guò)濾空格