淺談枚舉

爲什麼要用枚舉

  1. 可以解決代碼中硬編碼問題,數字不識意問題;
  2. 枚舉可以限定參數類型,對調用者的行爲能更加的進行控制,使參數範圍得到控制,防止惡意傳參;
  3. 代碼可讀性非常高 ,簡化代碼,讓代碼變得整潔。

與常量類的區別

相同點:

​    都是public static final…

不同點:

​    枚舉提供了比常量更多的方法,更爲靈活;

​    特定情況下,枚舉可以限制參數,防止惡意傳參;

 
部分情況下,也可用註解去替換枚舉,注意,是部分情況下!

 

解釋

  1. 解決代碼中硬編碼問題,數字不識意問題;

    你寫了一個小程序,不過好久不用了,突然有一天,你想使用一下它。程序要想正確運行,需要將今天星期幾存到數據庫裏。這個時候,你開始犯難了。

    當初的你還很年輕,不懂程序界的險惡,設計這個程序的時候,傻不拉幾把這個字段設計爲int類型的,用0代表週日,1代表週一。。。6代表週六,添加的時候就setWeekday(0)。但是這麼長時間沒用了,你忘記自己是從週一開始計算還是週日開始計算了,換句話說,你想不起來0代表的是週一還是週日了!

    於是你各種翻代碼,看數據庫的字段,數據庫保存的信息,終於搞懂了,你很開心,用了一次之後,覺得這個程序沒意思,又不用了。

    很久之後,你心血來潮,又想用一次它,很不幸,你又忘記到底0代表週一還是週日了,一番查找之後。你決定重構代碼,因爲你受不了了!!

    然後你想到了靜態變量

    public class Weekday {
        public final static int SUN = 0;
        public final static int MON = 1;
        public final static int TUE = 2;
        public final static int WED = 3;
        public final static int THU = 4;
        public final static int FRI = 5;
        public final static int SAT = 6;
    }
    
      機智如你,這個時候,只要`Weekday.SUN`就可以了,不用操心到底應該填寫0還是填寫1。 
    
  2. 枚舉可以限定參數類型,對調用者的行爲能更加的進行控制,使參數範圍得到控制,防止惡意傳參;

    這個就很好理解了,如果是調用者惡意傳參的話,比如,我傳一個星期八,而枚舉就很好的可以預防,如果不懂的話,看實例

    如果是靜態變量的話

    public static String doSth(int status){
                switch (status){
                    if(status == 1) {
                        return "MON";
                    }else if(status == 2) {
                        return "TUE";
                    }else if(status == 3) {
                        return "WED";
                    }else if(status == 4) {
                        return "THU";
                    }else if(status == 5) {
                        return "FRI";
                    }else if(status == 6) {
                        return "SAT";
                    }else {
                        return "SUN";
                    }
                }
            }
    

    如果我傳一個100呢…

    其次代碼可讀性很差,IDE 只是提示傳入 int 類型的參數。此時如果不看方法體,調用者根本不知道該傳什麼值。

  3. 代碼可讀性非常高 ,簡化代碼,讓代碼變得整潔。

    枚舉可以消除上述第二點衆多的if…else…

    public enum Weekday {
        SUN,MON,TUS,WED,THU,FRI,SAT
    }
    
  4. 相對與常量類來講,更爲靈活,可以設置方法體;

    public enum Weekday {
        SUN(0),MON(1),TUS(2),WED(3),THU(4),FRI(5),SAT(6);
    
        private int value;
    
        private Weekday(int value){
            this.value = value;
        }
    
        public static Weekday getNextDay(Weekday nowDay){
            int nextDayValue = nowDay.value;
    
            if (++nextDayValue == 7){
                nextDayValue =0;
            }
    
            return getWeekdayByValue(nextDayValue);
        }
    
        public static Weekday getWeekdayByValue(int value) {
            for (Weekday c : Weekday.values()) {
                if (c.value == value) {
                    return c;
                }
            }
            return null;
        }
    }
    

    枚舉的使用場景

  1. 作爲常量類使用;
  2. switch的應用;
  3. 枚舉內添加自定義方法;。
  4. 覆蓋枚舉的方法;
  5. 實現接口;
  6. 組織枚舉的使用;
  7. 枚舉集合的使用。

注意事項

**枚舉不可以繼承, 所有的枚舉都繼承自java.lang.Enum類 **

參考文獻

轉載請註明出處:
本文地址:http://blog.csdn.net/qq_31655965/article/details/55049192
原創自csdn:http://blog.csdn.net/qq_31655965
博主:clever_fan

推薦文獻

Java 枚舉(enum) 詳解7種常見的用法

使用枚舉代替常量,簡化工作!

優先使用註解,慎用枚舉

發佈了40 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章