java 使用枚舉定義常量

假如有一筆業(yè)務(wù)需要審核尖淘,審核狀態(tài)分:未審核萍摊,審核中当凡,審核通過(guò)山害,審核不通過(guò)。我們?cè)诔绦蚶锸欠窨梢灾苯舆@么寫(xiě):

if(state==1){//1代表未操作

????? //操作

}else{

???? //......

}

將狀態(tài)標(biāo)識(shí)直接寫(xiě)在代碼里面(硬編碼)沿量,只圖一時(shí)方便浪慌,卻是后患無(wú)窮,如果有一天你需要修改狀態(tài)標(biāo)識(shí)朴则,用0代表未審核而不是1权纤,你不得不將所有與該標(biāo)識(shí)相關(guān)的代碼都找出來(lái)一個(gè)個(gè)改,另外乌妒,在編碼過(guò)程中汹想,標(biāo)識(shí)輸入錯(cuò)誤的概率是比較高的,一不小心把0輸入成了10撤蚊,雖然不會(huì)提示任何編譯錯(cuò)誤古掏,但運(yùn)行結(jié)果將是出乎人的意料的。

于是我們很快想到可以用常量代替:

public static final int UNAUDIT = 0;

相關(guān)判斷代碼則是:

if(state==CONSTANT.UNAUDIT){

????? //操作

}else{

????? //......

}

這段代碼比硬編碼更加健壯容易維護(hù)侦啸,但是仍然有不足之處槽唾。

1、UNAUDIT是編譯期常量光涂,如果其值被改變庞萍,那么使用方需要重新編譯。

2忘闻、沒(méi)有簡(jiǎn)便的方法獲取標(biāo)識(shí)代表的字符串描述钝计。

于是我們用枚舉類來(lái)代替常量。

public enum AuditState {

???? UNAUDIT(1),

???? AUDITING(2),

???? AUDIT_SUCCESS(3),

???? AUDIT_FAIL(4);

private final int statenum;

??? AuditState(int statenum){

?? this.statenum = statenum;

}

public int getStatenum() {

??? return statenum;

}

}

調(diào)用如下:

if (state == AuditState.UNAUDIT.getStatenum()) {

??? //AuditState.UNAUDIT.toString()獲取字符串描述

System.out.println(

???? AuditState.UNAUDIT.toString() + "標(biāo)識(shí)是 "

??? + AuditState.UNAUDIT.getStatenum());

} else {

?? //......

}

枚舉類還有更加強(qiáng)大的功能齐佳,如添加字段葵蒂,方法,還可以對(duì)他進(jìn)行遍歷訪問(wèn)

一重虑、分析?

常量的聲明是每一個(gè)項(xiàng)目中不可或缺的践付,在Java1.5之前,我們只有兩種方式的聲明:類常量和接口常量缺厉。不過(guò)永高,在1.5版之后有了改進(jìn)隧土,即新增了一種常量聲明方式,枚舉常量命爬。代碼如下:?

enum Season{

? ? Spring,Summer,Autumn,Winter;

}

二曹傀、場(chǎng)景?

那么枚舉常量與我們的經(jīng)常使用的類常量和靜態(tài)常量比有什么優(yōu)勢(shì)呢??

1.枚舉常量更簡(jiǎn)單?

先把Season枚舉翻譯成接口饲宛,代碼如下:?

interface Season{

? ? int Sprint = 0;

? ? int Summer = 1;

? ? int Autumn = 2;

? ? int Winter = 3;

}

枚舉只需要定義每個(gè)枚舉項(xiàng)皆愉,不需要定義枚舉值,而接口常量(或類常量)則必須定義值艇抠,否則編譯通不過(guò)幕庐;兩個(gè)引用的方式相同(都是“類名.屬性”,如Season.Sprint)家淤,但是枚舉表示的是一個(gè)枚舉項(xiàng)异剥,字面含義是春天,而接口常量卻是一個(gè)Int類型絮重。?

2.枚舉常量屬于穩(wěn)態(tài)型?

使用常量接口冤寿,我們得對(duì)輸入值進(jìn)行檢查,確定是否越界青伤,如果常量非常龐大督怜,校驗(yàn)輸入就是一件非常麻煩的事情,但這是一個(gè)不可逃避的過(guò)程狠角。?

public void describe(int s){

? ? //s變量不能超越邊界亮蛔,校驗(yàn)條件

? ? if(s >= 0 && s <4){

? ? ? ? switch(s){

? ? ? ? ? ? case Season.Summer:

? ? ? ? ? ? ? ? System.out.println("Summer is very hot!");

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? case Season.Winter:

? ? ? ? ? ? ? ? System.out.println("Winter is very cold!");

? ? ? ? ? ? ? ? break;

? ? ? ? …..

? ? ? ? }

? ? }

}

我們?cè)賮?lái)看看枚舉常量是否能夠避免校驗(yàn)問(wèn)題,代碼如下:

public void describe(Season s){

? ? switch(s){

? ? ? ? case Season.Summer:

? ? ? ? ? ? System.out.println("Summer is very hot!");

? ? ? ? ? ? break;

? ? ? ? case Season.Winter:

? ? ? ? ? ? System.out.println("Winter is very cold!");

? ? ? ? ? ? break;

? ? ? ? …...

? ? }

}

不用校驗(yàn)擎厢,已經(jīng)限定了是Season枚舉,所以只能是Season類的四個(gè)實(shí)例辣吃。這也是我們看重枚舉的地方:在編譯期間限定類型动遭,不允許發(fā)生越界的情況。

3.枚舉具有內(nèi)置方法?

每個(gè)枚舉都是java.lang.Enum的子類神得,該基類提供了諸如獲得排序值的ordinal方法厘惦、compareTo比較方法等,大大簡(jiǎn)化了常量的訪問(wèn)哩簿。比如宵蕉,列出所有枚舉值:?

public static void main(String[] args){

? ? for(Season s:Season.values()){

? ? ? ? System.out.println(s);

? ? }

}

4.枚舉可以自定義方法?

這一點(diǎn)似乎不是枚舉的優(yōu)點(diǎn),類常量也可以有自己的方法节榜,但關(guān)鍵是枚舉常量不僅僅可以定義靜態(tài)方法羡玛,還可以定義非靜態(tài)方法,而且還能夠從根本上杜絕常量類被實(shí)例化宗苍。比如我們?cè)诙x獲取最舒服的季節(jié)稼稿,使用枚舉的代碼如下:?

enum Season{

? ? Spring,Summer,Autumn,Winter;

? ? //最舒服的季節(jié)

? ? public static Season getComfortableSeason(){

? ? ? ? return Spring;

? ? }

}

那如果是使用類常量如何實(shí)現(xiàn)呢薄榛?如下:?

class Season{

? ? public final static int Spring = 0;

? ? public final static int Summer = 1;

? ? public final static int Autumn = 2;

? ? public final static int Winter = 3;

? ? //最舒服的季節(jié)

? ? public static int getComfortableSeason(){

? ? ? ? return Spring;

? ? }

}

雖然枚舉在很多方面都比接口常量和類常量好用,但是它有一點(diǎn)比不上接口常量和類常量的让歼,就是繼承敞恋,枚舉類型是不能有繼承的,也就是說(shuō)一個(gè)枚舉常量定義完畢后谋右,除非修改重構(gòu)硬猫,否則無(wú)法做擴(kuò)展。?

三改执、建議?

在項(xiàng)目開(kāi)發(fā)中啸蜜,推薦使用枚舉常量代替接口常量或類常量。?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末天梧,一起剝皮案震驚了整個(gè)濱河市盔性,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呢岗,老刑警劉巖冕香,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異后豫,居然都是意外死亡悉尾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)挫酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)构眯,“玉大人,你說(shuō)我怎么就攤上這事早龟”拱裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵葱弟,是天一觀的道長(zhǎng)壹店。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芝加,這世上最難降的妖魔是什么硅卢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮藏杖,結(jié)果婚禮上将塑,老公的妹妹穿的比我還像新娘。我一直安慰自己蝌麸,他們只是感情好点寥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著来吩,像睡著了一般开财。 火紅的嫁衣襯著肌膚如雪棕孙。 梳的紋絲不亂的頭發(fā)上炫掐,一...
    開(kāi)封第一講書(shū)人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼弯院。 笑死卖氨,一個(gè)胖子當(dāng)著我的面吹牛坞淮,可吹牛的內(nèi)容都是我干的当纱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恤溶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼乓诽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起咒程,我...
    開(kāi)封第一講書(shū)人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸠天,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帐姻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體稠集,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年饥瓷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剥纷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呢铆,死狀恐怖晦鞋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棺克,我是刑警寧澤悠垛,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站娜谊,受9級(jí)特大地震影響确买,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜因俐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望周偎。 院中可真熱鬧抹剩,春花似錦、人聲如沸蓉坎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蛉艾。三九已至钳踊,卻和暖如春衷敌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拓瞪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工缴罗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭埂。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓面氓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蛆橡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舌界,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法泰演,內(nèi)部類的語(yǔ)法呻拌,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法睦焕,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,625評(píng)論 18 399
  • 昨天在做besuper的小型交互游戲的時(shí)候藐握,強(qiáng)默默走到我邊上,然后看了一眼我的代碼复亏,又一如既往的開(kāi)始噴我:你這寫(xiě)的...
    wuchaooooo閱讀 646評(píng)論 2 0
  • 一 Java 枚舉7常見(jiàn)種用法DK1.5引入了新的類型——枚舉趾娃。在 Java 中它雖然算個(gè)“小”功能,卻給我的開(kāi)發(fā)...
    歡樂(lè)時(shí)光歡樂(lè)你我閱讀 871評(píng)論 0 6
  • 我有故我疑缔御,我疑故我思抬闷。 我思故我知,我知故我在耕突。 萬(wàn)人從此生笤成,轉(zhuǎn)眼一覆滅。 世界無(wú)窮去眷茁,心中留君名炕泳。 綠園芳草盡...
    后夏夕顏心靜如水閱讀 277評(píng)論 0 4
  • 6/13作者講述了自己對(duì)孤獨(dú)的看法。他說(shuō)上祈,習(xí)慣了孤獨(dú)的自我培遵,習(xí)慣了個(gè)體與真實(shí)的自我不再有距離。人多的時(shí)候登刺,是無(wú)暇顧...
    向日葵的笑臉紅紅的閱讀 284評(píng)論 0 0