enum 枚舉

enum (enumeration), 是 JDK 1.5 中引入的新特性舍肠,在 java.lang 包中婶肩。

定義

創(chuàng)建枚舉類型使用 enum 關鍵字,創(chuàng)建的類型都是 java.lang.Enum(抽象類) 類的子類貌夕。枚舉類型符合通用模式 Class Enum<E extends Enum<E>>E 表示枚舉類型的名稱民镜。枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal)構造函數中啡专,在這里,每個值的名稱都被轉換成一個字符串制圈,并且序數設置表示了此設置被創(chuàng)建的順序们童。

public enum Week{
    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);
    ... ...
  1. 枚舉類是特殊的class,有構造器鲸鹦、方法和數據域慧库,被final修飾,不可被繼承馋嗜;
  2. 枚舉值MON, TUE...都是Week類型的靜態(tài)常量(public static final 修飾)齐板,故通常全部大寫。
// 獲取實例
Week w = Week.MON; 

使用

一. 自定義方法、覆蓋枚舉的方法

自定義方法時必須在enum實例序列最后添加分號甘磨。同時Java 要求必須先定義 enum 實例.

enum Week {
    MON(2016, 12, 12), TUE(2016, 12, 13), WED(2016, 12, 14), THU(2016, 12, 15), 
    FRI(2016, 12, 16), SUN(2016, 12, 17), SUN(2016, 12, 18); 

    //自定義數據域 (get橡羞、set 封裝)
    private int year; 
    private int mouth;
    private int day;

    // 構造枚舉值
    private Week (int year, int mouth, int day){ 
        this.year = year;
        this.mouth = mouth;
        this.day = day; 
    }

    // 自定義方法
    public String getDate(int day) { 
        for (Week w : Week.values()) { // 遍歷
            if (w.getDay() == day) { 
                return toString();
            } 
        } 
        return null; 
    }

    //覆蓋方法  
    @Override 
    public String toString() { 
         return w.year + "年" + w.mouth + "月" + w.day + "日" ;
    }  
}

注意:

  1. 構造器只在構造枚舉值時被調用;
  2. 構造器只能私有private济舆,不允許public修飾卿泽。保證了外部代碼無法構造新枚舉類的實例,因為枚舉值是public static final的常量滋觉。 但枚舉類的方法和數據域允許外部訪問签夭。
// 錯誤寫法
Week week = new Week(2017, 1, 1);

// 正確寫法
Week week = Week.MON;
System.out.println(week.getDate());

二. switch 操作

public void change() {

    Week week = Week.WED;
    switch (week) { 
         case MON: 
             week = Week.MON; 
             break; 
         case TUE: 
             week = Week.TUE; 
             break; 
         case WED: 
             week = Week.WED; 
             break;
           ……
}

三. 實現接口

枚舉繼承java.lang.Enum類。Java 不支持多繼承椎侠,所以枚舉對象不能繼承其它類第租。

public interface Behaviour { 
    void print(); 
    String getDayOfMouth(); 
} 

enum Week {
    MON(2016, 12, 12), TUE(2016, 12, 13), WED(2016, 12, 14), THU(2016, 12, 15), 
    FRI(2016, 12, 16), SUN(2016, 12, 17), SUN(2016, 12, 18); 

    // 成員變量 (get、set 封裝)
    private int year; 
    private int mouth;
    private int day;

    // 構造方法
    private Week (int year, int mouth, int day){ 
        this.year = year;
        this.mouth = mouth;
        this.day = day; 
    }

    // 接口方法
    @Override
    public String getDayOfMouth(int day) { 
        return this.day;
    }

    // 接口方法
    @Override 
    public String print() { 
        System.out.println(w.year + "年" + w.mouth + "月" + w.day + "日"); 
    }  

四. 接口組織枚舉

public interface Animal { 

    enum Water implements Animal { 
        SHARK, DOLPHIN, WHALE
    } 

    enum Land implements Animal { 
        DOG, CAT, PIG, WOLF, TIGER
    } 
} 

五. 方法

繼承于Enum的方法肺蔚。

  1. int compareTo(E o)
    比較此枚舉與指定對象的順序(Enum實現了java.lang.Comparable接口)煌妈。返回兩個枚舉值的順序之差。枚舉必須屬于同一個枚舉類宣羊,否則拋出ClassCastException()異常璧诵。
// MON, TUE, WED, THU, FRI, SUN, SUN
Week.MON.compareTo(Week.WED);  // 結果 -2
Week.WED.compareTo(Week.MON);  // 結果 2
  1. final boolean equals(Object other)
    比較兩個枚舉類對象的引用。
  2. Class<E> getDeclaringClass()
    返回與此枚舉常量的枚舉類型相對應的 Class 對象仇冯。
Week week = Week.MON;
System.out.println(week.getDeclaringClass().getName());
// 輸出結果:com.enumtest.test.Week;
  1. String name()
    返回此枚舉常量的名稱之宿,在其枚舉聲明中對其進行聲明。
  2. int ordinal()
    返回枚舉常量在枚舉類中的次序(初始常量序數為 0)苛坚。
Week.MON.ordinal();  // 結果 0
Week.WED.ordinal();  // 結果 2
  1. String toString()
    返回枚舉常量的名稱比被。
Week w = Week.MON;
System.out.println(w);//返回結果: MON
  1. static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
    返回帶指定名稱的指定枚舉類型的枚舉常量,與toString()方法相對應泼舱。
Week.valueOf("MON");  // 結果 Week.MON
  1. values()
    靜態(tài)方法等缀,返回一個包含全部枚舉值的數組。
Week weeks = Week.values();
for(Week w:weeks){
    System.out.print(w + ",");
}
//返回結果:MON, TUE, WED, THU, FRI, SUN, SUN

五. 枚舉集合

java.util.EnumSet:保證集合中的元素不重復娇昙。
java.util.EnumMapkeyenum類型尺迂,value可以是任意類型。

// EnumSet的使用
EnumSet<Week> weekSet = EnumSet.allOf(Week.class);
for (Week w : weekSet) {
    System.out.println(w);
}

// EnumMap的使用
EnumMap<Week, String> weekMap = new EnumMap(Week.class);
weekMap.put(Week.MON, "星期一");
weekMap.put(Week.TUE, "星期二");
// ... ...
for (Iterator<Entry<Week, String>> iter = weekMap.entrySet().iterator(); 
    iter.hasNext();) {
        Entry<Week, String> entry = iter.next();
        System.out.println(entry.getKey().name() + ":" + entry.getValue());
}

原理

enum 的語法結構和 class 的不同冒掌,但編譯器編譯之后生成一個class文件噪裕。經反編譯,可知該class文件生成了一個繼承java.lang.Enum<E>的類股毫。

public class com.dev.test.Week extends java.lang.Enum{
    public static final com.dev.test.Week MON;
    public static final com.dev.test.Week TUE;
    public static final com.dev.test.Week WED;
    public static final com.dev.test.Week THU;
    public static final com.dev.test.Week FRI;
    public static final com.dev.test.Week SAT;
    public static final com.dev.test.Week SUN;
    static {};
    public int getValue();
    public boolean isRest();
    public static com.dev.test.Week[] values();
    public static com.dev.test.Week valueOf(java.lang.String);
    com.dev.test.Week(java.lang.String, int, int, com.dev.test.Week);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末膳音,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子铃诬,更是在濱河造成了極大的恐慌祭陷,老刑警劉巖苍凛,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異颗胡,居然都是意外死亡毫深,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門毒姨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哑蔫,“玉大人,你說我怎么就攤上這事弧呐≌⒚裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵俘枫,是天一觀的道長腥沽。 經常有香客問我,道長鸠蚪,這世上最難降的妖魔是什么今阳? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮茅信,結果婚禮上盾舌,老公的妹妹穿的比我還像新娘。我一直安慰自己蘸鲸,他們只是感情好妖谴,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酌摇,像睡著了一般膝舅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窑多,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天仍稀,我揣著相機與錄音,去河邊找鬼埂息。 笑死琳轿,一個胖子當著我的面吹牛,可吹牛的內容都是我干的耿芹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼挪哄,長吁一口氣:“原來是場噩夢啊……” “哼吧秕!你這毒婦竟也來了?” 一聲冷哼從身側響起迹炼,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砸彬,失蹤者是張志新(化名)和其女友劉穎颠毙,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體砂碉,經...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蛀蜜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了增蹭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滴某。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滋迈,靈堂內的尸體忽然破棺而出霎奢,到底是詐尸還是另有隱情,我是刑警寧澤饼灿,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布幕侠,位于F島的核電站,受9級特大地震影響碍彭,放射性物質發(fā)生泄漏晤硕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一庇忌、第九天 我趴在偏房一處隱蔽的房頂上張望舞箍。 院中可真熱鬧,春花似錦漆枚、人聲如沸创译。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽软族。三九已至,卻和暖如春残制,著一層夾襖步出監(jiān)牢的瞬間立砸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工初茶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留颗祝,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓恼布,卻偏偏與公主長得像螺戳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子折汞,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容