爲什麼要用枚舉
- 可以解決代碼中硬編碼問題,數字不識意問題;
- 枚舉可以限定參數類型,對調用者的行爲能更加的進行控制,使參數範圍得到控制,防止惡意傳參;
- 代碼可讀性非常高 ,簡化代碼,讓代碼變得整潔。
與常量類的區別
相同點:
都是public static final…
不同點:
枚舉提供了比常量更多的方法,更爲靈活;
特定情況下,枚舉可以限制參數,防止惡意傳參;
部分情況下,也可用註解去替換枚舉,注意,是部分情況下!
解釋
-
解決代碼中硬編碼問題,數字不識意問題;
你寫了一個小程序,不過好久不用了,突然有一天,你想使用一下它。程序要想正確運行,需要將今天星期幾存到數據庫裏。這個時候,你開始犯難了。
當初的你還很年輕,不懂程序界的險惡,設計這個程序的時候,傻不拉幾把這個字段設計爲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。
-
枚舉可以限定參數類型,對調用者的行爲能更加的進行控制,使參數範圍得到控制,防止惡意傳參;
這個就很好理解了,如果是調用者惡意傳參的話,比如,我傳一個星期八,而枚舉就很好的可以預防,如果不懂的話,看實例
如果是靜態變量的話
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
類型的參數。此時如果不看方法體,調用者根本不知道該傳什麼值。 -
代碼可讀性非常高 ,簡化代碼,讓代碼變得整潔。
枚舉可以消除上述第二點衆多的if…else…
public enum Weekday { SUN,MON,TUS,WED,THU,FRI,SAT }
-
相對與常量類來講,更爲靈活,可以設置方法體;
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; } }
枚舉的使用場景
- 作爲常量類使用;
- switch的應用;
- 枚舉內添加自定義方法;。
- 覆蓋枚舉的方法;
- 實現接口;
- 組織枚舉的使用;
- 枚舉集合的使用。
注意事項
**枚舉不可以繼承, 所有的枚舉都繼承自java.lang.Enum類 **
參考文獻
轉載請註明出處:
本文地址:http://blog.csdn.net/qq_31655965/article/details/55049192
原創自csdn:http://blog.csdn.net/qq_31655965
博主:clever_fan