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

2019-03-09  本文已影响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个类(星期三四五六日代码被省略了,没写),可以看出,使用枚举能使我们减少类的定义,并且语义明确,使用面向对象的说法就是枚举实现了代码复用。

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

简简单单多好!

上一篇下一篇

猜你喜欢

热点阅读