java enum枚舉類(lèi)的用法以及高級(jí)玩法

enum(枚舉)類(lèi)介紹

**java枚舉類(lèi)是一組預(yù)定義常量的集合,使用enum關(guān)鍵字聲明這個(gè)類(lèi),常量名稱(chēng)官方建議大寫(xiě) **

1.enum類(lèi)基本用法

舉一個(gè)常見(jiàn)的例子志于,例如星期就可以描述為一個(gè)枚舉類(lèi)夺饲,如下

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY 
}

怎么調(diào)用呢,Java switch語(yǔ)句參數(shù)就支持enum類(lèi)

public class EnumTest {
    Day day;
    
    public EnumTest(Day day) {
        this.day = day;
    }
    
    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("周一各種不在狀態(tài)");
                break;
                    
            case FRIDAY:
                System.out.println("周五感覺(jué)還不錯(cuò)");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("周末給人的感覺(jué)是最棒的");
                break;
                        
            default:
                System.out.println("周內(nèi)感覺(jué)就那樣吧县钥。秀姐。。");
                break;
        }
    }
    
    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

運(yùn)行結(jié)果

EnumTest類(lèi)運(yùn)行結(jié)果.png

2.enum類(lèi)和static常量區(qū)別

看了上面的例子若贮,有些小伙伴就嗤之以鼻孔了省有,這沒(méi)什么嘛,java靜態(tài)常量也一樣可以辦到

public class EnumTest2 {
    public static final int MONDAY= 1;
    public static final int WEDNESDAY= 3;
    public static final int FRIDAY= 5;
    public static final int SATURDAY= 6;
    public static final int SUNDAY= 7;

    public void tellItLikeItIs(int day) {
        switch (day) {
            case 1:
                System.out.println("周一各種不在狀態(tài)");
                break;

            case 5:
                System.out.println("周五感覺(jué)還不錯(cuò)");
                break;

            case 6: case 7:
                System.out.println("周末給人的感覺(jué)是最棒的");
                break;

            default:
                System.out.println("周內(nèi)感覺(jué)就那樣吧谴麦。蠢沿。。");
                break;
        }
    }

    public static void main(String[] args) {
        EnumTest2 firstDay = new EnumTest2();
        firstDay.tellItLikeItIs(MONDAY);
        EnumTest2 thirdDay = new EnumTest2();
        thirdDay.tellItLikeItIs(WEDNESDAY);
        EnumTest2 fifthDay = new EnumTest2();
        fifthDay.tellItLikeItIs(FRIDAY);
        EnumTest2 sixthDay = new EnumTest2();
        sixthDay .tellItLikeItIs(SATURDAY);
        EnumTest2 seventhDay = new EnumTest2();
        seventhDay.tellItLikeItIs(SUNDAY);
    }
}

在這個(gè)使用方式效果上來(lái)看是沒(méi)有區(qū)別的匾效,其實(shí)enum類(lèi)的每一個(gè)枚舉值也是 static final的舷蟀,但是我們?yōu)槭裁匆x擇使用enum枚舉類(lèi)呢
1.static方式的靜態(tài)變量類(lèi)型不安全,我們可以在調(diào)用的時(shí)候傳入其他值弧轧,導(dǎo)致錯(cuò)誤
例如: seventhDay.tellItLikeItIs(999);
2.static方式的靜態(tài)變量不支持屬性擴(kuò)展雪侥,每一個(gè)key對(duì)應(yīng)一個(gè)值,而enum的每一個(gè)key可以擁有自己的屬性

3.enum類(lèi)自定義屬性

這就是enum比static靜態(tài)變量好用的地方了精绎,可以賦予每一個(gè)枚舉值若干個(gè)屬性速缨,例如

public enum Day {
    MONDAY(1, "星期一", "星期一各種不在狀態(tài)"),
    TUESDAY(2, "星期二", "星期二依舊犯困"),
    WEDNESDAY(3, "星期三", "星期三感覺(jué)半周終于過(guò)去了"),
    THURSDAY(4, "星期四", "星期四期待這星期五"),
    FRIDAY(5, "星期五", "星期五感覺(jué)還不錯(cuò)"),
    SATURDAY(6, "星期六", "星期六感覺(jué)非常好"),
    SUNDAY(7, "星期日", "星期日感覺(jué)周末還沒(méi)過(guò)夠。代乃。旬牲。");

    Day(int index, String name, String value) {
        this.index = index;
        this.name = name;
        this.value = value;
    }

    private int index;
    private String name;
    private String value;

    public int getIndex() {
        return index;
    }

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

    public String getName() {
        return name;
    }

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

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

這次測(cè)試類(lèi)就有些些變化了,更靈活了

public class EnumTest {
    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println(day.getName()+day.getValue());
                break;

            case FRIDAY:
                System.out.println(day.getName()+day.getValue());
                break;

            case SATURDAY: case SUNDAY:
                System.out.println(day.getName()+day.getValue());
                break;

            default:
                System.out.println(day.getName()+day.getValue());
                break;
        }
    }

    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

執(zhí)行結(jié)果

EnumTest類(lèi)運(yùn)行結(jié)果.png

4.enum類(lèi)高級(jí)玩法

你以為enum這樣就完了么搁吓,還有更好玩的東西原茅,每一個(gè)enum枚舉值還可以擁有各自的內(nèi)部方法!二話(huà)不說(shuō)堕仔,上栗子

public enum Day {
    MONDAY(1, "星期一", "各種不在狀態(tài)"){
        @Override
        public Day getNext() {
            return TUESDAY;
        }
    },
    TUESDAY(2, "星期二", "依舊犯困"){
        @Override
        public Day getNext() {
            return WEDNESDAY;
        }
    },
    WEDNESDAY(3, "星期三", "感覺(jué)半周終于過(guò)去了"){
        @Override
        public Day getNext() {
            return THURSDAY;
        }
    },
    THURSDAY(4, "星期四", "期待這星期五"){
        @Override
        public Day getNext() {
            return FRIDAY;
        }
    },
    FRIDAY(5, "星期五", "感覺(jué)還不錯(cuò)"){
        @Override
        public Day getNext() {
            return SATURDAY;
        }
    },
    SATURDAY(6, "星期六", "感覺(jué)非常好"){
        @Override
        public Day getNext() {
            return SUNDAY;
        }
    },
    SUNDAY(7, "星期日", "感覺(jué)周末還沒(méi)過(guò)夠擂橘。。摩骨。"){
        @Override
        public Day getNext() {
            return MONDAY;
        }
    };

    Day(int index, String name, String value) {
        this.index = index;
        this.name = name;
        this.value = value;
    }

    private int index;
    private String name;
    private String value;
    public abstract Day getNext();

    public int getIndex() {
        return index;
    }

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

    public String getName() {
        return name;
    }

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

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

調(diào)用下看看

public class EnumTest {
    Day day;

    public EnumTest(Day day) {
        this.day = day;
    }

    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println(day.getName()+day.getValue());
                System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
                break;

            case FRIDAY:
                System.out.println(day.getName()+day.getValue());
                System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
                break;

            case SATURDAY: case SUNDAY:
                System.out.println(day.getName()+day.getValue());
                System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
                break;

            default:
                System.out.println(day.getName()+day.getValue());
                System.out.println(day.getName()+"的下一天是"+day.getNext().getName());
                break;
        }
    }

    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

執(zhí)行結(jié)果

EnumTest類(lèi)運(yùn)行結(jié)果.png

5.參照文檔

http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末通贞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恼五,更是在濱河造成了極大的恐慌昌罩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灾馒,死亡現(xiàn)場(chǎng)離奇詭異茎用,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)轨功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)旭斥,“玉大人,你說(shuō)我怎么就攤上這事夯辖×鹪ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蒿褂,是天一觀的道長(zhǎng)圆米。 經(jīng)常有香客問(wèn)我,道長(zhǎng)啄栓,這世上最難降的妖魔是什么娄帖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮昙楚,結(jié)果婚禮上近速,老公的妹妹穿的比我還像新娘。我一直安慰自己堪旧,他們只是感情好削葱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著淳梦,像睡著了一般析砸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爆袍,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天首繁,我揣著相機(jī)與錄音,去河邊找鬼陨囊。 笑死弦疮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜘醋。 我是一名探鬼主播胁塞,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼压语!你這毒婦竟也來(lái)了闲先?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤无蜂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蒙谓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體斥季,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酣倾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舵揭。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖躁锡,靈堂內(nèi)的尸體忽然破棺而出午绳,到底是詐尸還是另有隱情,我是刑警寧澤映之,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布拦焚,位于F島的核電站,受9級(jí)特大地震影響杠输,放射性物質(zhì)發(fā)生泄漏赎败。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一蠢甲、第九天 我趴在偏房一處隱蔽的房頂上張望僵刮。 院中可真熱鬧,春花似錦鹦牛、人聲如沸搞糕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窍仰。三九已至,卻和暖如春拉鹃,著一層夾襖步出監(jiān)牢的瞬間辈赋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工膏燕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钥屈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓坝辫,卻偏偏與公主長(zhǎng)得像篷就,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子近忙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法竭业,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法及舍,繼承相關(guān)的語(yǔ)法未辆,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,625評(píng)論 18 399
  • 1锯玛、.java源文件: 一個(gè)以”.java“為后綴的源文件:只能有一個(gè)與文件名相同的類(lèi)咐柜,可以包含其他類(lèi)兼蜈。 2、類(lèi)方...
    Hughman閱讀 1,466評(píng)論 1 9
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,965評(píng)論 6 13
  • 不知道什么時(shí)候養(yǎng)成的癖好拙友,特別喜歡聽(tīng)別人講故事为狸。有時(shí)候出門(mén)去,兩個(gè)人站在路邊家長(zhǎng)里短地閑聊遗契,聲音就會(huì)自動(dòng)傳到我的耳...
    碧云女子閱讀 225評(píng)論 0 2
  • 大概是終于有時(shí)間辐棒,可以稍微停下來(lái)記錄下東西了。感覺(jué)這個(gè)學(xué)期經(jīng)歷的事情太多了不寫(xiě)來(lái)下簡(jiǎn)直對(duì)不起這么苦逼的熬過(guò)來(lái)的生活...
    Elitack閱讀 839評(píng)論 0 1