Java枚舉

ava中的枚舉是在JDK1.5以后出現(xiàn)的。之前的開發(fā)過程中并沒有用過,但是有碰到過關(guān)于枚舉的代碼好唯。貌似是一種更為簡單有效的常量定義方式馍资。學習之筒主,希望以后的寫代碼過程中可以熟悉并掌握枚舉的用法。

使用場景:

每當需要一組固定的常量的時候,如一周的天數(shù)乌妙、一年四季等使兔。或者是在我們編譯前就知道其包含的所有值的集合藤韵,比如定義了一些狀態(tài)等等虐沥。這個時候就有可能需要使用枚舉了。

與 public static final 的常量定義方式進行比較:

在以上的場景中泽艘,回顧以往的做法欲险,比如我們定義這樣一些狀態(tài):

public class State {
    public static final int Normal = 0;//正常
    public static final int Update = 1;//已更新
    public static final int Delete = 2;//已刪除
}


使用的時候,在程序中直接使用 類名.常量名 就可以了匹涮。但是這樣還存在一些問題天试。比如:

public void doSomething(int state){
    switch(state){
        case State.Normal:
          ...
          break;
        case State.Update:
          ...
          break;
        case State.Delete:
          ...
          break;
        default:
          ...
    }
}
  1. 在程序運行過程中,傳入的state變量很有可能并不是我們期待的焕盟。比如 doSomething(4) 這樣的調(diào)用方式有可能出現(xiàn)問題秋秤,因為我們想要的參數(shù)值僅僅是Normal、Update脚翘、Delete中的一個灼卢。為此,我們不得不在default分支中做一些處理來應對這種情況来农。換句話說鞋真,這是類型不安全的。

  2. 另外沃于,在我們對程序進行調(diào)試的過程中涩咖,上面定義的常量會轉(zhuǎn)換成一些毫無意義的整數(shù)值,也就是所謂的魔術(shù)數(shù)字繁莹。給我們的調(diào)試帶來痛苦檩互。

  3. 因為整形枚舉屬于編譯期常量,所以編譯過程完成后咨演,所有客戶端和服務器端引用的地方闸昨,會直接將整數(shù)值寫入。這樣薄风,當你修改舊的枚舉整數(shù)值后或者增加新的枚舉值后饵较,所有引用地方代碼都需要重新編譯,否則運行時刻就會出現(xiàn)錯誤遭赂。

那如果換成枚舉常量呢循诉?

public enum State {
    Normal,Update,Delete
}

類型安全檢查:

public void doSomething(State state){
    switch(state){
        case Normal:
          ...
          break;
        case Update:
          ...
          break;
        case Delete:
          ...
          break;
        default:
          ...
    }
}

調(diào)用doSomething(State state)方法時,在編譯期間就會限定類型撇他,不允許越界的情況出現(xiàn)茄猫。

另外狈蚤,枚舉提供了一些內(nèi)置的方法,比如划纽,列出所有的枚舉值等炫惩。這些方法簡化了常量的使用。

枚舉類型的使用

  • 常量
public enum State{
    Normal,Update,Delete
}

遍歷枚舉常量:

   for(State state:State.values()){
        System.out.println(state);
   }
  • 自定義屬性阿浓、方法
public enum State{
    //若之后為枚舉類型添加屬性或方法他嚷,最后一個枚舉常量后面記得加分號
    Normal("正常",0),Update("已更新",1),Delete("已刪除",2);
    private String name;
    private int index;
    // 構(gòu)造方法,注意:構(gòu)造方法不能為public芭毙,因為enum并不可以被實例化
    private State(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // get set 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    // 普通方法
    public static String getName(int index) {
        for (State c : State .values()) {
            if (c.getIndex() == index) {
                return c.name;
            }
        }
        return null;
    }

    //覆蓋toString方法,這樣調(diào)試就不會看到魔術(shù)數(shù)字啦
    @Override
    public String toString(){
        return name+":"+index;
    }    
}

public void test(){
    for (State state : State.values()) {
        //輸出:正常:0 已更新:1 已刪除:2
        System.out.println(state);
    }
}

實際上筋蓖,以上枚舉聲明定義的類型是一個final類,因此枚舉類型不可以被繼承退敦。所有的枚舉都繼承自java.lang.Enum類粘咖。
其中,Normal侈百、Update瓮下、Delete是這個枚舉類的三個實例,他們都是static final類型的對象钝域。Normal("正常",0),Update("已更新",1),Delete("已刪除",2)正是調(diào)用了State類的私有構(gòu)造函數(shù)State(String name, int index)進行實例化的讽坏。

因此,枚舉類型可以作為一個類來使用例证,其不能被繼承路呜。所以他比常量枚舉更加強大。

  • 實現(xiàn)接口
public interface HandleState{
    void printState();
}

public enum State implements HandleState{
    //若之后為枚舉類型添加屬性或方法织咧,最后一個枚舉常量后面記得加分號
    Normal("正常",0),Update("已更新",1),Delete("已刪除",2);
    private String name;
    private int index;
    // 構(gòu)造方法胀葱,注意:構(gòu)造方法不能為public,因為enum并不可以被實例化
    private State(String name, int index) {
        this.name = name;
        this.index = index;
    }

    // get set 方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    // 普通方法
    public static String getName(int index) {
        for (State c : State .values()) {
            if (c.getIndex() == index) {
                return c.name;
            }
        }
        return null;
    }

    //覆蓋toString方法,這樣調(diào)試就不會看到魔術(shù)數(shù)字啦
    @Override
    public String toString(){
        return name+":"+index;
    }  

    public void printState() {
        System.out.println(this);
    }
}

可以看到笙蒙,枚舉和一般的類一樣都可以實現(xiàn)接口抵屿。

  • Enum 相關(guān)工具類

JDK5.0 中在增加 Enum 類的同時,也增加了兩個工具類 EnumSet 和 EnumMap捅位,這兩個類都放在 java.util 包中轧葛。具體的使用就查看官方文檔吧,這里不再贅述绿渣。

參考

java enum的用法詳解[轉(zhuǎn)]

Java 語言中Enum類型的使用介紹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朝群,一起剝皮案震驚了整個濱河市燕耿,隨后出現(xiàn)的幾起案子中符,更是在濱河造成了極大的恐慌,老刑警劉巖誉帅,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淀散,死亡現(xiàn)場離奇詭異右莱,居然都是意外死亡,警方通過查閱死者的電腦和手機档插,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門慢蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人郭膛,你說我怎么就攤上這事晨抡。” “怎么了则剃?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵耘柱,是天一觀的道長。 經(jīng)常有香客問我棍现,道長调煎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任己肮,我火速辦了婚禮士袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谎僻。我一直安慰自己娄柳,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布艘绍。 她就那樣靜靜地躺著西土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍盗。 梳的紋絲不亂的頭發(fā)上需了,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音般甲,去河邊找鬼肋乍。 笑死,一個胖子當著我的面吹牛敷存,可吹牛的內(nèi)容都是我干的墓造。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼锚烦,長吁一口氣:“原來是場噩夢啊……” “哼觅闽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涮俄,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛉拙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彻亲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕锄,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡吮廉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畸肆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宦芦。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖轴脐,靈堂內(nèi)的尸體忽然破棺而出调卑,到底是詐尸還是另有隱情,我是刑警寧澤大咱,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布令野,位于F島的核電站,受9級特大地震影響徽级,放射性物質(zhì)發(fā)生泄漏气破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一餐抢、第九天 我趴在偏房一處隱蔽的房頂上張望现使。 院中可真熱鬧,春花似錦旷痕、人聲如沸碳锈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽售碳。三九已至,卻和暖如春绞呈,著一層夾襖步出監(jiān)牢的瞬間贸人,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工佃声, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留艺智,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓圾亏,卻偏偏與公主長得像十拣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子志鹃,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

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

  • 一夭问、什么是枚舉? 枚舉是由一組固定的常量組成的合法值曹铃。通過這一定義缰趋,我們可以看出枚舉的核心在于常量,而且常量是固定...
    Roger_黃閱讀 965評論 0 4
  • 概念 enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性埠胖。 在Java中,被 en...
    靜默虛空閱讀 8,478評論 1 18
  • 一 Java 枚舉7常見種用法DK1.5引入了新的類型——枚舉淳玩。在 Java 中它雖然算個“小”功能直撤,卻給我的開發(fā)...
    歡樂時光歡樂你我閱讀 875評論 0 6
  • 枚舉可以實現(xiàn)接口 enum 可以像一般類一樣實現(xiàn)接口。 同樣是實現(xiàn)上一節(jié)中的錯誤碼枚舉類蜕着,通過實現(xiàn)接口谋竖,可以約束它...
    java部落閱讀 181評論 0 1
  • 在中國蓖乘,關(guān)于猶太人的故事與傳說一直為人所津津樂道,只要提起猶太人韧骗,大家充滿羨慕嘉抒,都有這樣的結(jié)論:猶太人是世界上最聰...
    沈極舒閱讀 75,023評論 18 46