java enum(枚舉)使用詳解 + 總結

來源:互聯網
上載者:User

    enum 的全稱為 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中。

    下面是我在使用 enum 過程中的一些經驗和總結,主要包括如下內容:

1. 原始的介面定義常量

2. 文法(定義)

3. 遍曆、switch 等常用操作

4. enum 對象的常用方法介紹

5. 給 enum 自訂屬性和方法

6. EnumSet,EnumMap 的應用

7. enum 的原理分析

8. 總結

原始的介面定義常量
public interface IConstants {    String MON = "Mon";    String TUE = "Tue";    String WED = "Wed";    String THU = "Thu";    String FRI = "Fri";    String SAT = "Sat";    String SUN = "Sun";}
文法(定義)

    建立枚舉類型要使用 enum 關鍵字,隱含了所建立的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類別)。枚舉類型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚舉類型的名稱。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 建構函式中,在這裡,每個值的名稱都被轉換成一個字串,並且序數設定表示了此設定被建立的順序。

package com.hmw.test;/** * 枚舉測試類別 * @author <a href="mailto:hemingwang0902@126.com">何明旺</a> */public enum EnumTest {    MON, TUE, WED, THU, FRI, SAT, SUN;}

這段代碼實際上調用了7次 Enum(String name, int ordinal):

new Enum<EnumTest>("MON",0);new Enum<EnumTest>("TUE",1);new Enum<EnumTest>("WED",2);    ... ...
遍曆、switch 等常用操作

對enum進行遍曆和switch的操作範例程式碼:

public class Test {    public static void main(String[] args) {        for (EnumTest e : EnumTest.values()) {            System.out.println(e.toString());        }                System.out.println("----------------我是分隔線------------------");                EnumTest test = EnumTest.TUE;        switch (test) {        case MON:            System.out.println("今天是星期一");            break;        case TUE:            System.out.println("今天是星期二");            break;        // ... ...        default:            System.out.println(test);            break;        }    }}

輸出結果:

MONTUEWEDTHUFRISATSUN----------------我是分隔線------------------今天是星期二
enum 對象的常用方法介紹

int compareTo(E o)

          比較此枚舉與指定對象的順序。

Class<E> getDeclaringClass()

          返回與此枚舉常量的枚舉類型相對應的 Class 對象。

String name()

          返回此枚舉常量的名稱,在其枚舉聲明中對其進行聲明。

int ordinal()

          返回枚舉常量的序數(它在枚舉聲明中的位置,其中初始常量序數為零)。

String toString()

           返回枚舉常量的名稱,它包含在聲明中。

static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)

          返回帶指定名稱的指定枚舉類型的枚舉常量。

public class Test {    public static void main(String[] args) {        EnumTest test = EnumTest.TUE;                //compareTo(E o)        switch (test.compareTo(EnumTest.MON)) {        case -1:            System.out.println("TUE 在 MON 之前");            break;        case 1:            System.out.println("TUE 在 MON 之後");            break;        default:            System.out.println("TUE 與 MON 在同一位置");            break;        }                //getDeclaringClass()        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());                //name() 和  toString()        System.out.println("name(): " + test.name());        System.out.println("toString(): " + test.toString());                //ordinal(), 傳回值是從 0 開始        System.out.println("ordinal(): " + test.ordinal());    }}

輸出結果:

TUE 在 MON 之後getDeclaringClass(): com.hmw.test.EnumTestname(): TUEtoString(): TUEordinal(): 1
給 enum 自訂屬性和方法

給 enum 對象加一下 value 的屬性和 getValue() 的方法:

package com.hmw.test;/** * 枚舉測試類別 *  * @author <a href="mailto:hemingwang0902@126.com">何明旺</a> */public enum EnumTest {    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6) {        @Override        public boolean isRest() {            return true;        }    },    SUN(0) {        @Override        public boolean isRest() {            return true;        }    };    private int value;    private EnumTest(int value) {        this.value = value;    }    public int getValue() {        return value;    }    public boolean isRest() {        return false;    }}
public class Test {    public static void main(String[] args) {        System.out.println("EnumTest.FRI 的 value = " + EnumTest.FRI.getValue());    }}

輸出結果:

EnumTest.FRI 的 value = 5
EnumSet,EnumMap 的應用
public class Test {    public static void main(String[] args) {        // EnumSet的使用        EnumSet<EnumTest> weekSet = EnumSet.allOf(EnumTest.class);        for (EnumTest day : weekSet) {            System.out.println(day);        }        // EnumMap的使用        EnumMap<EnumTest, String> weekMap = new EnumMap(EnumTest.class);        weekMap.put(EnumTest.MON, "星期一");        weekMap.put(EnumTest.TUE, "星期二");        // ... ...        for (Iterator<Entry<EnumTest, String>> iter = weekMap.entrySet().iterator(); iter.hasNext();) {            Entry<EnumTest, String> entry = iter.next();            System.out.println(entry.getKey().name() + ":" + entry.getValue());        }    }}
原理分析

        enum 的文法結構儘管和 class 的文法不一樣,但是經過編譯器編譯之後產生的是一個class檔案。該class檔案經過反編譯可以看到實際上是產生了一個類,該類繼承了java.lang.Enum<E>。EnumTest 經過反編譯(javap com.hmw.test.EnumTest 命令)之後得到的內容如下:

public class com.hmw.test.EnumTest extends java.lang.Enum{    public static final com.hmw.test.EnumTest MON;    public static final com.hmw.test.EnumTest TUE;    public static final com.hmw.test.EnumTest WED;    public static final com.hmw.test.EnumTest THU;    public static final com.hmw.test.EnumTest FRI;    public static final com.hmw.test.EnumTest SAT;    public static final com.hmw.test.EnumTest SUN;    static {};    public int getValue();    public boolean isRest();    public static com.hmw.test.EnumTest[] values();    public static com.hmw.test.EnumTest valueOf(java.lang.String);    com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);}

所以,實際上 enum 就是一個 class,只不過 java 編譯器幫我們做了文法的解析和編譯而已。

總結

    可以把 enum 看成是一個普通的 class,它們都可以定義一些屬性和方法,不同之處是:enum 不能使用 extends 關鍵字繼承其他類,因為 enum 已經繼承了 java.lang.Enum(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.