java enum枚舉類的用法以及高級玩法

enum(枚舉)類介紹

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

1.enum類基本用法

舉一個常見的例子,例如星期就可以描述為一個枚舉類,如下

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

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

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("周五感覺還不錯");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("周末給人的感覺是最棒的");
                break;
                        
            default:
                System.out.println("周內(nèi)感覺就那樣吧。。。");
                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();
    }
}

運行結(jié)果

EnumTest類運行結(jié)果.png

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

看了上面的例子,有些小伙伴就嗤之以鼻孔了,這沒什么嘛,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("周五感覺還不錯");
                break;

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

            default:
                System.out.println("周內(nèi)感覺就那樣吧。。。");
                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);
    }
}

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

3.enum類自定義屬性

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

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

    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;
    }
}

這次測試類就有些些變化了,更靈活了

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類運行結(jié)果.png

4.enum類高級玩法

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

public enum Day {
    MONDAY(1, "星期一", "各種不在狀態(tài)"){
        @Override
        public Day getNext() {
            return TUESDAY;
        }
    },
    TUESDAY(2, "星期二", "依舊犯困"){
        @Override
        public Day getNext() {
            return WEDNESDAY;
        }
    },
    WEDNESDAY(3, "星期三", "感覺半周終于過去了"){
        @Override
        public Day getNext() {
            return THURSDAY;
        }
    },
    THURSDAY(4, "星期四", "期待這星期五"){
        @Override
        public Day getNext() {
            return FRIDAY;
        }
    },
    FRIDAY(5, "星期五", "感覺還不錯"){
        @Override
        public Day getNext() {
            return SATURDAY;
        }
    },
    SATURDAY(6, "星期六", "感覺非常好"){
        @Override
        public Day getNext() {
            return SUNDAY;
        }
    },
    SUNDAY(7, "星期日", "感覺周末還沒過夠。。。"){
        @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類運行結(jié)果.png

5.參照文檔

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,626評論 18 399
  • 1、.java源文件: 一個以”.java“為后綴的源文件:只能有一個與文件名相同的類,可以包含其他類。 2、類方...
    Hughman閱讀 1,738評論 1 9
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,306評論 6 13
  • 不知道什么時候養(yǎng)成的癖好,特別喜歡聽別人講故事。有時候出門去,兩個人站在路邊家長里短地閑聊,聲音就會自動傳到我的耳...
    碧云女子閱讀 266評論 0 2
  • 大概是終于有時間,可以稍微停下來記錄下東西了。感覺這個學期經(jīng)歷的事情太多了不寫來下簡直對不起這么苦逼的熬過來的生活...
    Elitack閱讀 921評論 0 1

友情鏈接更多精彩內(nèi)容