文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
什么是枚举
枚举是JDK1.5新增的一种数据类型,是一种特殊的类,常用于表示一组常量,比如一年四季,12个月份,星期一到星期天,服务返回的错误码,结算支付的方式等等。枚举是使用enum关键字来定义。
枚举的使用
在使用枚举之前我们先探讨一个问题,为什么要使用枚举。
现在有个业务场景是结算支付,有支付宝和微信支付两种方式,1表示支付宝,2表示微信支付,还需要根据编码(1或2)获取相应的英文名,如果不用枚举,我们就要这样写。
public class PayTypeUtil {
//支付宝
private static final int ALI_PAY = 1;
//微信支付
private static final int WECHAT_PAY = 2;
//根据编码获取支付方式的名称
public String getPayName(int code) {
if (ALI_PAY == code) {
return "Ali_Pay";
}
if (WECHAT_PAY == code) {
return "Wechat_Pay";
}
return null;
}
}
如果这时,产品经理说要增加一个银联支付,就要加多if的判断,就会造成有多少种支付方式,就有多少个if
,非常难看。
如果使用枚举,就变得很优雅,先看代码:
public enum PayTypeEnum {
/** 支付宝*/
ALI_PAY(1, "ALI_PAY"),
/** 微信支付*/
WECHAT_PAY(2, "WECHAT_PAY");
private int code;
private String describe;
PayTypeEnum(int code, String describe) {
this.code = code;
this.describe = describe;
}
//根据编码获取支付方式
public PayTypeEnum find(int code) {
for (PayTypeEnum payTypeEnum : values()) {
if (payTypeEnum.getCode() == code) {
return payTypeEnum;
}
}
return null;
}
//getter、setter方法
}
当我们需要扩展,只需要定义多一个实例即可,其他代码都不用动,比如加多一个银联支付。
/** 支付宝*/
ALI_PAY(1, "ALI_PAY"),
/** 微信支付*/
WECHAT_PAY(2, "WECHAT_PAY"),
//只需要加多一行代码即可完成扩展
/** 银联支付*/
UNION_PAY(3,"UNION_PAY");
一般在实际项目中,最多的写法就是这样,主要是简单明了,易于扩展。
第二种常见的用法是结合switch-case使用,比如我定义一个一年四季的枚举。
public enum Season {
//春
SPRING,
//夏
SUMMER,
//秋
AUTUMN,
//冬
WINTER;
}
然后结合switch使用。
public static void main(String[] args) throws Exception{
doSomething(Season.SPRING);
}
private static void doSomething(Season season){
switch (season){
case SPRING:
System.out.println("不知细叶谁裁出,二月春风似剪刀");
break;
case SUMMER:
System.out.println("接天莲叶无穷碧,映日荷花别样红");
break;
case AUTUMN:
System.out.println("停车坐爱枫林晚,霜叶红于二月花");
break;
case WINTER