浅谈枚举

为什么要用枚举

  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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章