美文网首页
为什么我喜欢枚举(1)--语法糖而已

为什么我喜欢枚举(1)--语法糖而已

作者: 用一会再说 | 来源:发表于2019-03-09 17:07 被阅读0次

    我开始喜欢枚举,就像喜欢你。

    JAVA的枚举在JDK1.5开始引入,好用。

    枚举,在数学上是指有穷序列集,就是说某一类东西,能一一列出来。比如月份,可以有一月、二月......十二月,不能再多了,星期也是一样的概念。先声明,如果只是简单的穷举,除了语义更明确,我没觉得用“枚举”来替代“一个接口定义几个常量”这种方式有什么其他优势,只有被穷举的对象有一定业务性导致其具有一定复杂性,枚举才体现其简约。

    还是拿星期几这个有穷序列集来说。假设我们定义星期几具有英文名、中文名两个属性,还有一个表示这一天要干什么的操作方法。没有枚举之前我们也许是这样做的:

    定义一个父类(这里我用抽象类)

    public abstract class WeeKDay {
       protected String ename;
       protected String cname;
       public abstract void plan();
    }
    

    定义星期一

    public class Monday extends WeeKDay {
        public Monday(String ename, String cname) {
            this.ename = ename;
            this.cname = cname;
        }
        @Override
        public void plan() {
            System.out.println("今天要做计划");
        }
    }
    

    定义星期二

    public class Tuesday extends WeeKDay {
        public Tuesday(String ename, String cname) {
            this.ename = ename;
            this.cname = cname;
        }
        @Override
        public void plan() {
            System.out.println("今天要赶进度");
        }
    }
    

    定义星期三四五六日皆是如此,此处省略!有了定义之后我们来一一列举星期几这个有穷序列集。

    public interface WeeKDayEnum {
        WeeKDay Monday = new Monday("Monday","星期一");
        WeeKDay Tuesday = new Tuesday("Tuesday","星期二");
        /**
         * 省略星期三四五六日
         */
    }
    

    如上加上我们省略掉的,要穷举星期几这样一个具有一定复杂性的有穷序列集,我们要写九个类,JAVA语法真啰嗦!有了枚举之后我们可以这样写:

    public enum WeeKDayEnum2 {
    
        Mon("Monday","星期一"){
            @Override
            public void plan() {
                System.out.println("今天要做计划");
            }
        },Tues("Tuesday","星期二") {
            @Override
            public void plan() {
                System.out.println("今天要赶进度");
            }
        };
        /**
         * 此处省略三四五六日枚举
         */
        private String ename;
        private String cname;
        public abstract void plan();
    }
    

    只需要enum关键字定义一个类就可以代替上面的九个类,确实简约!事实上现实中的业务比星期几这个概念要复杂些,没有枚举的话可能还需要更多的类定义,比如星期几里面的计划,我们现在仅仅是简单地输出一句话而已。
    以上便是JAVA枚举语法糖的一个优势,既然是语法糖,也就是说,只是看起来是这样子,事实上枚举定义编译后,也是被编译成了多个class。这个可以查看编译后的class文件就知道了!

    javac -encoding utf-8 WeeKDayEnum.java
    
    image.png

    WeeKDayEnum.java被编译成了3个类(星期三四五六日代码被省略了,没写),可以看出,使用枚举能使我们减少类的定义,并且语义明确,使用面向对象的说法就是枚举实现了代码复用。

    以上,网上到处是,但也是我一个个敲出来的,权当表达对枚举这一语义明确、高度复用的简约代码的喜爱,后续会补充我喜欢的用法。

    简简单单多好!

    相关文章

      网友评论

          本文标题:为什么我喜欢枚举(1)--语法糖而已

          本文链接:https://www.haomeiwen.com/subject/kqispqtx.html