为什么要用枚举
- 可以解决代码中硬编码问题,数字不识意问题;
- 枚举可以限定参数类型,对调用者的行为能更加的进行控制,使参数范围得到控制,防止恶意传参;
- 代码可读性非常高 ,简化代码,让代码变得整洁。
与常量类的区别
相同点:
都是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