Java枚舉

背景

Java枚舉類型是java1.5后提出的,解決了使用public static final定義的變量的類型安全性和程序可讀性無法保證的問題。

看下面代碼:

public class Seasons {
    public static final int SPRING = 1;
    public static final int SUMMER = 2;
    public static final int AUTUMN = 3;
    public static final int WINTER = 4;

    public String getChineseSeason(int season){
        StringBuffer result = new StringBuffer();
        switch(season){
            case Seasons.SPRING :
                result.append("春天");
                break;
            case Seasons.SUMMER :
                result.append("夏天");
                break;
            case Seasons.AUTUMN :
                result.append("秋天");
                break;
            case Seasons.WINTER :
                result.append("冬天");
                break;
            default :
                result.append("666666666");
                break;
        }
        return result.toString();
    }
}
    // 正常的使用情況
    getChineseSeason(Seasons.SPRING);
    // 非正常的使用情況
    getChineseSeason(-1);

在非正常使用情況下,就會得到錯誤的值嗎,顯然不符合javac程序的類型安全。
在這種情況下就有了java枚舉類型。

枚舉

枚舉類型是由enum關(guān)鍵字聲明的類。

就像這樣:

public enum  Seasons {
    SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4);

    private int code;
    /**
     * 枚舉的構(gòu)造函數(shù)
     * @param code
     */
    Seasons(int code) {
        this.code = code;
    }
    public int getCode(){
        return code;
    }
    public static String getChineseSeason(Seasons season){
        StringBuffer result = new StringBuffer();
        switch(season){
            case SPRING :
                result.append("春天:" + season.name() + ",數(shù)據(jù):" + season.getCode());
                break;
            case AUTUMN :
                result.append("秋天:" + season.name() + ",數(shù)據(jù):" + season.getCode());
                break;
            case SUMMER :
                result.append("夏天:" + season.name() + ",數(shù)據(jù):" + season.getCode());
                break;
            case WINTER :
                result.append("冬天:" + season.name() + ",數(shù)據(jù):" + season.getCode());
                break;
            default :
                result.append("6666666 " + season.name());
                break;
        }
        return result.toString();
    }
}

把Seasons類使用枚舉改寫了一下
使用方法類似,但是是無法使用枚舉類的構(gòu)造函數(shù)去對進行賦值,這樣保證了安全。

    // 正常的使用情況
    getChineseSeason(Seasons.SPRING);
    // 非正常的使用情況(編譯器會報錯)
    getChineseSeason(-1);

枚舉還能夠定義多個參數(shù),只要在構(gòu)造方法里面增加就可以

public enum  Seasons {
    SPRING(1,"春天"),SUMMER(2,"夏天"),AUTUMN(3,"秋天"),WINTER(4,"冬天");
    private int code;
    private String str;
    /**
     * 枚舉的構(gòu)造函數(shù)
     * @param code
     * @param str
     */
    Seasons(int code,String str) {
        this.code = code;
        this.str = str;
    }
    public int getCode(){
        return code;
    }
    public String getStr(){
        return str;
    }
    // 因為值寫在枚舉里面了,所以getChineseSeason可以簡化
    public static String getChineseSeason(Seasons season){
        StringBuffer result = new StringBuffer();
        result.append(season.getStr() + season.name() + ",數(shù)據(jù):" + season.getCode());
        return result.toString();
    }
    // 重寫一下toString方法
    @Override
    public String toString() {
        return "季節(jié)是:"+str;
    }
}

測試一下:

System.out.println(Seasons.getChineseSeason(Seasons.AUTUMN));
System.out.println(Seasons.AUTUMN.toString());

結(jié)果是

秋天AUTUMN,數(shù)據(jù):3
季節(jié)是:秋天

總結(jié)

在定義一組固定的常量的時候使用枚舉能夠方便很多,簡單易用。

可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,但是要注意enum 不能使用 extends 關(guān)鍵字繼承其他類,因為 enum 已經(jīng)繼承了 java.lang.Enum。

最后編輯于
?著作權(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)容

  • 概念 enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性。 在Java中,被 en...
    靜默虛空閱讀 8,692評論 1 18
  • 一 Java 枚舉7常見種用法DK1.5引入了新的類型——枚舉。在 Java 中它雖然算個“小”功能,卻給我的開發(fā)...
    歡樂時光歡樂你我閱讀 914評論 0 6
  • 枚舉的特性 枚舉的特性,歸結(jié)起來就是一句話: 除了不能繼承,基本上可以將 enum 看做一個常規(guī)的類。 但是這句話...
    java部落閱讀 415評論 0 2
  • 枚舉可以添加方法 在概念章節(jié)提到了,枚舉值默認為從0開始的有序數(shù)值 。那么問題來了:如何為枚舉顯示的賦值。 Jav...
    java部落閱讀 377評論 0 0
  • 2015.9月上了高中后第一眼看到的人是他 個子不高但是長得蠻帥 搭訕了幾句話后來一起出去玩又看到了他 再后來軍訓(xùn)...
    HeyDoRiEs閱讀 281評論 0 0

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