Java枚舉介紹及使用詳解

來源:互聯網
上載者:User

標籤:java枚舉   enum   枚舉   

在實際編程中,往往存在著這樣的“資料集”,它們的數值在程式中是穩定的,而且“資料集”中的元素是有限的。

例如星期一到星期日七個資料元素組成了一周的“資料集”,花牌 (春夏秋冬)四個資料元素組成了四季的“資料集”。

在java中如何更好的使用這些“資料集”呢?在jdk1.5之前我們或許會這樣寫:

static class Grade {private Grade() {}public static final Grade A = new Grade();public static final Grade B = new Grade();public static final Grade C = new Grade();public static final Grade D = new Grade();public static final Grade E = new Grade();}

將類的建構函式私人,並且在內部new出這幾個資料集來供外部使用。其實這樣寫可能會帶來其它問題,在jdk1.5時,出現枚舉,更好的解決了這一問題。下面就簡單介紹一下枚舉的用法吧。

@Testpublic void test() {print(Grade.A);}private void print(Grade grade) {System.out.println(grade.toString());}//定義一個枚舉類,裡面每一個枚舉值就代表一個對象enum Grade{A,B,C,D,E;}

其實枚舉類就是一個特殊的Java類,因為我們在聲明一個枚舉類時,也可以聲明屬性 方法和建構函式,但是建構函式必須是私人的。如下代碼所示:

@Testpublic void test() {print(Grade.A);}private void print(Grade grade) {System.out.println(grade.label);System.out.println(grade.getLabel());}enum Grade {A("100-91"), B("90-81"), C("80-71"), D("70-60"), E("60-0");private String label;private Grade(String label) {this.label = label;}private String getLabel(){return this.label;}}

枚舉類還可以定義抽象方法,但是需要枚舉值去實現,也可以實現介面或者繼承抽象類別,如下:

@Testpublic void test() {print(Grade.B);}private void print(Grade grade) {System.out.println(grade.label);System.out.println(grade.getLabel());System.out.println(grade.getCNLebal());}enum Grade {A("100-91") {@Overridepublic String getCNLebal() {return "優秀";}},B("90-81") {@Overridepublic String getCNLebal() {return "良好";}},C("80-71") {@Overridepublic String getCNLebal() {return "一般";}},D("70-60") {@Overridepublic String getCNLebal() {return "及格";}},E("60-0") {@Overridepublic String getCNLebal() {return "差";}};private String label;private Grade(String label) {this.label = label;}private String getLabel() {return this.label;}public abstract String getCNLebal();}

下面再簡單介紹一下Eunm類的常用用法,參見代碼吧:

@Testpublic void test() {print(Grade.B);//Grade.values() 得到所有的枚舉值 ,返回一個數組System.out.println("分數等級個數為:" + Grade.values().length);for (Grade grade : Grade.values()) {String name = grade.name();System.out.println("當枚舉值的name為:" + name);int ordinal = grade.ordinal();System.out.println("當前枚舉值的座標為:" + ordinal);}//Grade.valueOf("W")   Grade.valueOf(Grade.class, "E") 將當前字串轉換成一個枚舉,如果失敗則拋出參數非法異常Grade grade = Grade.valueOf("C");print(grade);Grade grade2 = Grade.valueOf(Grade.class, "E");print(grade2);}private void print(Grade grade) {System.out.println(grade.label);System.out.println(grade.getLabel());System.out.println(grade.getCNLebal());}enum Grade {A("100-91") {@Overridepublic String getCNLebal() {return "優秀";}},B("90-81") {@Overridepublic String getCNLebal() {return "良好";}},C("80-71") {@Overridepublic String getCNLebal() {return "一般";}},D("70-60") {@Overridepublic String getCNLebal() {return "及格";}},E("60-0") {@Overridepublic String getCNLebal() {return "差";}};private String label;private Grade(String label) {this.label = label;}private String getLabel() {return this.label;}public abstract String getCNLebal();}

在我們的程式中,枚舉可以用的地方挺多的,下面以一個項目中的case來舉例吧,比如我們android連網請求用戶端,兩者通訊會定義很多code和對應的message,那麼在程式中可以利用枚舉進行簡單的實現:

public enum ServerCode {    UNKNOWN(-1, "未知錯誤"),    SUCCESS(0, "成功"),    PARSE_ERROR(100,"傳回值解析出錯!"),    NET_IO_ERROR(101,"網路通訊出錯!");       private int code = 0;    private String message = "";    private ServerCode(int errorCode, String message) {        this.code = errorCode;        this.message = message;    }    public static ServerCode valueOf(int errorCode) {        for (ServerCode code : values()) {            if (code.code == errorCode) {                return code;            }        }        return UNKNOWN;    }    public int code() {        return code;    }    @Override    public String toString() {        return message;    }

相信大家都可以看懂上面代碼把,這樣在程式中就可以為我們省略很多不必要的操作。當然枚舉使用的範圍不僅於此,還有很多很多。

常用用法說完了,大體總結一下吧:

Java中聲明的枚舉類,均是java.lang.Enum類的孩子,它繼承了Enum類的所有方法。常用方法:
name()
ordinal()
valueof()
values()遍曆枚舉中所有的枚舉值
枚舉類的特性:
枚舉類是一種特殊形式的java類
聲明的每一個枚舉值代表枚舉類的一個實力對象
與java中的普通類一樣,在聲明枚舉類時,也可以聲明屬性 方法和建構函式,但枚舉類中的建構函式必須為私人的
枚舉類可以實現介面或者繼承抽象類別
JDK5中擴充了switch語句,可以接收int byte char short 枚舉
若枚舉類只有一個枚舉值,則可以當作單利設計模式使用 

Java枚舉介紹及使用詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.