少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          java的Enum枚舉類型終于在j2se1.5出現(xiàn)了。之前覺得它只不過是雞肋而已,可有可無。畢竟這么多年來,沒有它,大家不都過得很好嗎?今日看《Thinking in Java》4th edition,里面有一句話“有時恰恰因?yàn)樗悴拍軌?優(yōu)雅而干凈"地解決問題。優(yōu)雅與清晰很重要,正式它們區(qū)別了成功的解決方案與失敗的解決方案。而失敗的解決方案就是因?yàn)槠渌藷o法理他。"使用Enum枚舉類型,可以將以前笨拙的代碼變得優(yōu)雅簡單?但是,我同時也在思考另外一個問題,使用新的技術(shù),會不會給技術(shù)人員帶來更多的負(fù)擔(dān)呢?

          "學(xué)習(xí)新版語言的一個危險就是瘋狂使用新的語法結(jié)構(gòu)"

          先學(xué)習(xí)一下enum的簡單應(yīng)用,以下簡潔的代碼已經(jīng)包括enum所提供的絕大部分功能。

          1.enum的應(yīng)用,包括定義,遍歷,switch,enumset,enummap等

          Java代碼 

           

           import java.util.EnumMap;
          import java.util.EnumSet;
          public class EnumTest {
           // 定義一個enum枚舉類型,包括兩個實(shí)例ON,OFF
           public enum State {
            ON, OFF
           };
           // 測試函數(shù)
           public static void main(String[] args) {
            // 直接變量enum
            for (State s : State.values())
             System.out.println(s.name());
            // switch與enum的結(jié)合使用
            State switchState = State.OFF;
            switch (switchState) {
            case OFF:
             System.out.println("OFF");
             break;
            case ON:
             System.out.println("ON");
             break;
            }
            // EnumSet的使用
            EnumSet<State> stateSet = EnumSet.allOf(State.class);
            for (State s : stateSet) {
             System.out.println(s);
            }
            // EnumMap的使用
            EnumMap<State,String> stateMap = new EnumMap<State,String>(State.class);
            stateMap.put(State.ON, "is On");
            stateMap.put(State.OFF, "is off");
            for (State s : State.values()) {
             System.out.println(s.name() + ":" + stateMap.get(s));
            }
           }

           

           



          package com.aicent.test;
          public enum TestEnumMathod {
           // 為每個enum實(shí)例添加不同的實(shí)現(xiàn)方法
           SAMPLE1 {
            String getInfo() {
             return "SAMPLE1";
            }
           },
           SAMPLE2 {
            String getInfo() {
             return "SAMPLE2";
            }
           };
           abstract String getInfo();
           // 測試
           public static void main(String args[]) {
            for (TestEnumMathod method : values()) {
             System.out.println(method.getInfo());
            }
           }
          }




          以下內(nèi)容可能有些無聊,但絕對值得一窺
          1.代碼:
          public class State {
          public static final int ON = 1;
          public static final Int OFF= 0;
          }

           

          有什么不好了,大家都這樣用了很長時間了,沒什么問題啊。
          首先,它不是類型安全的。你必須確保是int
          其次,你還要確保它的范圍是0和1
          最后,很多時候你打印出來的時候,你只看到 1 和0 ,

          但其沒有看到代碼的人并不知道你的企圖,拋棄你所有舊的public static final常量吧

          2.可以創(chuàng)建一個enum類,把它看做一個普通的類。除了它不能繼承其他類了。(java是單繼承,它已經(jīng)繼承了Enum),
          可以添加其他方法,覆蓋它本身的方法

          3.switch()參數(shù)可以使用enum了

          4.values()方法是編譯器插入到enum定義中的static方法,所以,當(dāng)你將enum實(shí)例向上轉(zhuǎn)型為父類Enum是,values()就不可訪問了。解決辦法:在Class中有一個getEnumConstants()方法,所以即便Enum接口中沒有values()方法,我們?nèi)匀豢梢酝ㄟ^Class對象取得所有的enum實(shí)例

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

          6.使用EnumSet代替標(biāo)志。enum要求其成員都是唯一的,但是enum中不能刪除添加元素。

          7.EnumMap的key是enum,value是任何其他Object對象。

          8.enum允許程序員為eunm實(shí)例編寫方法。所以可以為每個enum實(shí)例賦予各自不同的行為。

          9.使用enum的職責(zé)鏈(Chain of Responsibility) .這個關(guān)系到設(shè)計模式的職責(zé)鏈模式。以多種不同的方法來解決一個問題。然后將他們鏈接在一起。當(dāng)一個請求到來時,遍歷這個鏈,直到鏈中的某個解決方案能夠處理該請求。

          10.使用enum的狀態(tài)機(jī)

          11.使用enum多路分發(fā)

           

          轉(zhuǎn)載自:http://blog.csdn.net/mqboss/article/details/5647851

          posted on 2012-03-15 11:16 abin 閱讀(461) 評論(0)  編輯  收藏 所屬分類: java集合類
          主站蜘蛛池模板: 鸡西市| 韩城市| 茂名市| 临漳县| 勃利县| 怀来县| 贵定县| 平顺县| 青岛市| 古丈县| 鄂州市| 高密市| 上杭县| 博爱县| 鹤峰县| 印江| 互助| 祥云县| 连州市| 古田县| 德清县| 搜索| 鲁甸县| 廉江市| 扎兰屯市| 泾源县| 胶南市| 体育| 荆门市| 凤阳县| 花莲县| 张家港市| 邹城市| 固原市| 南安市| 崇信县| 乌拉特后旗| 南溪县| 镇坪县| 台北县| 江都市|