java enum

java enum是jdk1.5引入的 豺谈,在java.lang包中蔚携。Java Enum類型的語法結(jié)構(gòu)盡管和java類的語法不一樣嚼贡,應(yīng)該說差別比較大占贫。但是經(jīng)過編譯器編譯之后產(chǎn)生的是一個class文件鬓催。該class文件經(jīng)過反編譯可以看到實際上是生成了一個類肺素,該類繼承了java.lang.Enum<E>。

使用

創(chuàng)建枚舉類型要是要enum關(guān)鍵字宇驾,是繼承java.lang.Enum抽象類的倍靡,所以枚舉類型不能繼承其他類了,但可以實現(xiàn)其他接口课舍。
枚舉類型的每一個值都將映射到 protected Enum(String name, int ordinal) 構(gòu)造函數(shù)中塌西,在這里他挎,每個值的名稱都被轉(zhuǎn)換成一個字符串,并且序數(shù)設(shè)置表示了此設(shè)置被創(chuàng)建的順序捡需。


public enum EnumTest {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

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

new Enum<EnumTest>("MON",0);
new Enum<EnumTest>("TUE",1);
new Enum<EnumTest>("WED",2);
   //......

使用switch
enum Signal {
        GREEN, YELLOW, RED
    }

    public class TrafficLight {
        Signal color = Signal.RED;

        public void change() {
            switch (color) {
            case RED:
                color = Signal.GREEN;
                break;
            case YELLOW:
                color = Signal.RED;
                break;
            case GREEN:
                color = Signal.YELLOW;
                break;
            }
        }
    }
在枚舉類中定義屬性和方法

如果打算自定義自己的方法办桨,那么必須在enum實例序列的最后添加一個分號。
而且 要求必須先定義 enum 實例站辉。

public enum Color {
        //這里相當(dāng)于Color RED=new Color("紅色", 1)呢撞; 
        RED("紅色", 1), GREEN("綠色", 2), BLANK("白色", 3), YELLO("黃色", 4);

        // 成員變量
        private String name;
        private int index;

        // 構(gòu)造方法
        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 普通方法
        public static String getName(int index) {
            for (Color c : Color.values()) {
                if (c.getIndex() == index) {
                    return c.name;
                }
            }
            return null;
        }

        // get set 方法
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }
    }
使用接口組織枚舉

無法從enum繼承子類,如果需要擴(kuò)展enum中的元素饰剥,在一個接口的內(nèi)部殊霞,創(chuàng)建實現(xiàn)該接口的枚舉,以此將元素進(jìn)行分組捐川。達(dá)到將枚舉元素進(jìn)行分組的目的脓鹃。

public interface Food {
        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }

        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }
 for (Food.DessertEnum dessertEnum : Food.DessertEnum.values()) {  
        System.out.print(dessertEnum + "  ");  
    }  
enumMap

java.util.EnumSet和java.util.EnumMap是兩個枚舉集合。EnumSet保證集合中的元素不重復(fù);EnumMap中的 key是enum類型古沥,而value則可以是任意類型瘸右。

Map接口的實現(xiàn)類,其key-value映射中的key是Enum類型岩齿;
其原理就是一個對象數(shù)組太颤,數(shù)組的下標(biāo)索引就是根據(jù)Map中的key直接獲取,即枚舉中的ordinal值盹沈;
效率比HashMap高龄章,可以直接獲取數(shù)組下標(biāo)索引并訪問到元素;

enum Operate{
    ADD, UPDATE, DELETE; 
}

public class Main {

    public static void main(String[] args) {
        Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);


        //put方法
        map.put(Operate.ADD, "add operate");
        map.put(Operate.UPDATE, "update operate");
        map.put(Operate.DELETE, "delete operate");
        
        //重寫了toString方法
        System.out.println(map);
        
        //size方法
        System.out.println(map.size());
        
        System.out.println(map.containsKey(Operate.UPDATE));
        System.out.println(map.containsValue("update operate"));
        System.out.println(map.get(Operate.DELETE));
        
        //remove
        map.remove(Operate.UPDATE);
        System.out.println(map);
        
        //key集合
        for(Operate operate:map.keySet()){
            System.out.print(operate + " ");
        }
        
        System.out.println();
        //value集合
        for(String obj:map.values()){
            System.out.print(obj + ",");
        }
        
        System.out.println();
        //key-value集合
        for(Entry<Operate, String> entry:map.entrySet()){
            System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
        }

    }
}

輸出:

{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
3
true
true
delete operate
{ADD=add operate, DELETE=delete operate}
ADD DELETE 
add operate,delete operate,
ADD: add operate, DELETE: delete operate, 

枚舉的用法

(1) 常用于對同一類常量進(jìn)行分類乞封。如color做裙、weekday
(2) 聲明接口方法時,輸入?yún)?shù)類型采用枚舉比用原始類型值常量更嚴(yán)謹(jǐn).
(3) 常量有時往往不僅僅只是一個值,有可能會包含多個屬性,此時很適合用枚舉
(4) 有時常量對象需要從配置文件中讀取其描述信息或者UI顯示信息,此時也適合用枚舉
(5)

注意:

  • 枚舉類型對象之間的值比較,是可以使用==肃晚,直接來比較值锚贱,是否相等的。因為在Enum類里面关串,已經(jīng)重寫了equals方法拧廊,而方法里面比較就是直接使用==。
  • 聲明枚舉屬性時最好用public final修飾,使用起來會非常方便 晋修。
  • values()方法是編譯器插入到enum定義中的static方法吧碾,所以,當(dāng)你將enum實例向上轉(zhuǎn)型為父類Enum時墓卦,values()就不可訪問了倦春。解決辦法:在Class中有一個getEnumConstants()方法,所以即便Enum接口中沒有values()方法,我們?nèi)匀豢梢酝ㄟ^Class對象取得所有的enum實例溅漾。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末山叮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子添履,更是在濱河造成了極大的恐慌,老刑警劉巖脑又,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暮胧,死亡現(xiàn)場離奇詭異,居然都是意外死亡问麸,警方通過查閱死者的電腦和手機(jī)往衷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來严卖,“玉大人席舍,你說我怎么就攤上這事∠剩” “怎么了来颤?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稠肘。 經(jīng)常有香客問我福铅,道長,這世上最難降的妖魔是什么项阴? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任滑黔,我火速辦了婚禮,結(jié)果婚禮上环揽,老公的妹妹穿的比我還像新娘略荡。我一直安慰自己,他們只是感情好歉胶,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布汛兜。 她就那樣靜靜地躺著,像睡著了一般跨扮。 火紅的嫁衣襯著肌膚如雪序无。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天衡创,我揣著相機(jī)與錄音帝嗡,去河邊找鬼。 笑死璃氢,一個胖子當(dāng)著我的面吹牛哟玷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼巢寡,長吁一口氣:“原來是場噩夢啊……” “哼喉脖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抑月,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤树叽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谦絮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题诵,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年层皱,在試婚紗的時候發(fā)現(xiàn)自己被綠了性锭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡叫胖,死狀恐怖草冈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓮增,我是刑警寧澤怎棱,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站钉赁,受9級特大地震影響蹄殃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜你踩,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一诅岩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧带膜,春花似錦吩谦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芭挽,卻和暖如春滑废,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袜爪。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工蠕趁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辛馆。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓俺陋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腊状,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容