2018-12-30

參考文章 https://blog.csdn.net/javazejian/article/details/71333103
參考書籍 effective java》

原理闡述

使用關(guān)鍵字enum創(chuàng)建枚舉類型并編譯后摄狱,編譯器會(huì)為我們生成一個(gè)類鸳吸,這個(gè)類繼承了Java API中的java.lang.Enum類割去。
這個(gè)類繼承了Java API中的java.lang.Enum類,編譯器會(huì)自動(dòng)添加方法杜耙、生成枚舉實(shí)例樊拓。

整體的感受是典勇,編譯器做了這樣的事情: 建造單例枚舉值蝶糯,用數(shù)組來容納這些枚舉值。

常見用法

1.常量
2.switch
3.實(shí)現(xiàn)接口
4.接口組合枚舉
5.定義抽象方法
6.單例模式
7.枚舉集合EnumSet和EnumMap

代碼演示

  • 演示枚舉原理

比如一個(gè)java class是這樣

enum PeriodApply {

    APPLY_INPROCESS("1", "申請(qǐng)中"),
    APPLY_FAILED("2", "申請(qǐng)失敗"),
    APPLY_SUCCESSFULLY("3", "申請(qǐng)成功"),

    ;
    private String code;

    private String desc;

    PeriodApply(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    }

編譯過后的代碼其實(shí)是這樣:

final class PeriodPay extends Enum {
    private PeriodPay(String s, int i, String code, String desc)
    {
        super(s, i);
        this.code = code;
        this.desc = desc;
    }


    public static final PeriodPay PAY_INPROCESS;
    public static final PeriodPay PAY_FAILED;
    public static final PeriodPay PAY_SUCCESSFULLY;
    private String code;
    private String desc;

    static
    {
        PAY_INPROCESS = new PeriodPay("PAY_INPROCESS", 0, "1", "申請(qǐng)中");
        PAY_FAILED = new PeriodPay("PAY_FAILED", 1, "2", "申請(qǐng)失敗");
        PAY_SUCCESSFULLY = new PeriodPay("PAY_SUCCESSFULLY", 2, "2", "申請(qǐng)成功");

    }
}

  • 演示接口組合枚舉1
public enum EnumMeal {
    APPETIZER(Food.Appetizer.class),
    MAINCOURSE(Food.MainCourse.class),
    ;
    private Food[] values;

    private EnumMeal(Class<? extends Food> kind) {
        //通過class對(duì)象獲取枚舉實(shí)例
        values = kind.getEnumConstants();
    }

    public Food[] getValues() {
        return values;
    }

    public void setValues(Food[] values) {
        this.values = values;
    }

    public static void main(String[] args) {
        System.out.println("開胃菜:" + Arrays.toString(APPETIZER.getValues()));
    }

    public interface Food {
        enum Appetizer implements Food {
            SALAD, SOUP, SPRING_ROLLS;
        }

        enum MainCourse implements Food {
            LASAGNE, BURRITO, PAD_THAI,
            LENTILS, HUMMOUS, VINDALOO;
        }


    }
}
  • 演示接口組合枚舉2

場(chǎng)景
申請(qǐng)狀態(tài)的枚舉划乖,A業(yè)務(wù)和B業(yè)務(wù)關(guān)心的枚舉粗細(xì)程度不一樣贬养,A關(guān)心申請(qǐng)失敗或成功,B不僅關(guān)心成功失敗琴庵,還要關(guān)心是因?yàn)槭裁丛蚴 ?/p>

名稱 申請(qǐng)中 申請(qǐng)成功 申請(qǐng)失敗
A業(yè)務(wù) 申請(qǐng)中 申請(qǐng)成功 申請(qǐng)失敗
B業(yè)務(wù) 上級(jí)領(lǐng)導(dǎo)已審批
CTO已審批
申請(qǐng)成功 上級(jí)領(lǐng)導(dǎo)駁回失敗
CTO駁回失敗

上級(jí)領(lǐng)導(dǎo)已審批 和 CTO已審批 都是屬于申請(qǐng)中的狀態(tài)误算,
上級(jí)領(lǐng)導(dǎo)駁回失敗 和 CTO駁回失敗 都是屬于申請(qǐng)失敗的狀態(tài)

將所有情況列在同一個(gè)枚舉類中,枚舉中增加新的標(biāo)志PeriodI迷殿,來表明枚舉值的分類儿礼。

public enum EnumBH {

    APPLY_LEADER_PASS("101", "上級(jí)領(lǐng)導(dǎo)已審批", PeriodApply.APPLY_INPROCESS),
    APPLY_CTO_PASS("102", "CTO已審批", PeriodApply.APPLY_INPROCESS),
    APPLY_LEADER_REJECT("200", "上級(jí)領(lǐng)導(dǎo)駁回失敗", PeriodApply.APPLY_FAILED),
    APPLY_CTO_REJECT("201", "CTO駁回失敗", PeriodApply.APPLY_FAILED),
    APPLY_SUCCESSFULLY("300", "申請(qǐng)成功", PeriodApply.APPLY_SUCCESSFULLY),


    PAY_CONFIRMING("300", "收款方確認(rèn)中", PeriodPay.PAY_INPROCESS),
    PAY_CC_NOT_ENOUGH("300", "信用卡額度不足", PeriodPay.PAY_FAILED),
    PAY_BC_NOT_ENOUGH("300", "銀行卡余額不足", PeriodPay.PAY_FAILED),
    PAY_SUCCESSFULLY("300", "支付成功", PeriodPay.PAY_SUCCESSFULLY),

    ;
    private String code;
    private String desc;
    private PeriodI periodI;

    EnumBH(String code, String desc, PeriodI periodI) {
        this.code = code;
        this.desc = desc;
        this.periodI = periodI;
    }
}
interface PeriodI {
}
enum PeriodPay implements PeriodI {
    PAY_INPROCESS("1", "支付中"),
    PAY_FAILED("2", "支付失敗"),
    PAY_SUCCESSFULLY("2", "支付成功"),
    ;
}

enum PeriodApply implements PeriodI {
    APPLY_INPROCESS("1", "申請(qǐng)中"),
    APPLY_FAILED("2", "申請(qǐng)失敗"),
    APPLY_SUCCESSFULLY("3", "申請(qǐng)成功"),

    ;
 

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庆寺,隨后出現(xiàn)的幾起案子蜘犁,更是在濱河造成了極大的恐慌,老刑警劉巖止邮,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奏窑,居然都是意外死亡导披,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門埃唯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩匕,“玉大人,你說我怎么就攤上這事墨叛≈贡希” “怎么了模蜡?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扁凛。 經(jīng)常有香客問我忍疾,道長(zhǎng),這世上最難降的妖魔是什么谨朝? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任卤妒,我火速辦了婚禮,結(jié)果婚禮上字币,老公的妹妹穿的比我還像新娘则披。我一直安慰自己,他們只是感情好洗出,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布士复。 她就那樣靜靜地躺著,像睡著了一般翩活。 火紅的嫁衣襯著肌膚如雪阱洪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天隅茎,我揣著相機(jī)與錄音澄峰,去河邊找鬼。 笑死辟犀,一個(gè)胖子當(dāng)著我的面吹牛俏竞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堂竟,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼魂毁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了出嘹?” 一聲冷哼從身側(cè)響起席楚,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎税稼,沒想到半個(gè)月后烦秩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郎仆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年只祠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扰肌。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抛寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盗舰,我是刑警寧澤晶府,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站钻趋,受9級(jí)特大地震影響川陆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜爷绘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一书劝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧土至,春花似錦购对、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楷扬,卻和暖如春解幽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烘苹。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工躲株, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镣衡。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓霜定,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親廊鸥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子望浩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 本文章涉及代碼已放到github上annotation-study 1.Annotation為何而來 What:A...
    zlcook閱讀 29,178評(píng)論 15 116
  • 代碼注入 一般修改原始的程序,可以利用代碼注入的方式惰说。注入代碼可以選擇利用FrameWork或者Dylib等三方庫...
    八廿四閱讀 689評(píng)論 1 0
  • 女兒即將6歲了磨德,陪女兒一起閱讀,以及和女兒散步時(shí)總喜歡和她讀各種各樣的商店名吆视、廣告牌上面的字典挑,這已經(jīng)是我們...
    澤路閱讀 196評(píng)論 0 1