我开始喜欢枚举,就像喜欢你。
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个类(星期三四五六日代码被省略了,没写),可以看出,使用枚举能使我们减少类的定义,并且语义明确,使用面向对象的说法就是枚举实现了代码复用。
以上,网上到处是,但也是我一个个敲出来的,权当表达对枚举这一语义明确、高度复用的简约代码的喜爱,后续会补充我喜欢的用法。
简简单单多好!