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

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

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

3f3a7de11812

image.png

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

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

简简单单多好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值