通常情况下,在表达某些特定字段、参数时,使用定义常量来表达时,很难明确表达出字段、参数意义,代码可读性很差。
/** * 订单类 */ public class Order{ /** * 订单编号 */ String orderNumber; /** * 支付方式 * 0:微信app * 1:微信公众号 * 2:支付宝app */ Integer payType; } /** * 修改支付方式方法 * @param orderNumber * @param payType */ public void updatePayType(String orderNumber,Integer payType){ //业务逻辑 }在对于updatePayType(String orderNumber,Integer payType)的调用者来说,参数payType就不友好,此处容易传错。
换成枚举看看:
/** * 支付类型 */ public enum PayTypeEnum{ //定义元素 WECHA_APP(0),WECHA_PUB(1),ALIPAY_APP(2); int value; PayTypeEnum(int value) { this.value = value; } public int getValue() { return value; } }方法参数改为:updatePayType(String orderNumber,PayTypeEnum payType)
/** * 修改支付方式 * @param orderNumber * @param payType */ public void updatePayType(String orderNumber,PayTypeEnum payType){ //业务逻辑 }调用时:updatePayType("1234",PayTypeEnum.ALIPAY_APP);可读性提高了,后期维护也更方便。
进一步优化,可以把Order类中的payType字段换成PayTypeEnum 枚举类型。
/** * 订单类 */ public class Order{ /** * 订单编号 */ String orderNumber; /** * 支付方式 */ PayTypeEnum payType; public void setPayType(PayTypeEnum payType) { this.payType = payType; } }
一、枚举的多样玩法
1、基础版
/** * 颜色列举 */ public enum ColorEnum{ RED,YELLOW,BLUE, } public static void main(String[] args) { System.out.println(ColorEnum.BLUE);//输出:BLUE //valueOf(String name)根据元素名称获取元素 System.out.println(ColorEnum.valueOf("YELLOW"));//输出:YELLOW // values() 返回所有ColorEnum元素 System.out.println(ColorEnum.values()[0]);//输出:RED }2、渐进版
/** * 支付类型 */ public enum PayTypeEnum{ //定义元素 WECHA_APP(0),WECHA_PUB(1),ALIPAY_APP(2); int value; PayTypeEnum(Integer value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { System.out.println(PayTypeEnum.ALIPAY_APP);//输出:ALIPAY_APP System.out.println(PayTypeEnum.ALIPAY_APP.getValue());//输出:2 }3、增强版
/** * 支付类型 */ public enum PayTypeEnum { //定义元素 WECHA_APP(0, "微信app"), WECHA_PUB(1, "微信公众号"), ALIPAY_APP(2, "支付宝app"); Integer value; String name; PayTypeEnum(Integer value, String name) { this.value = value; this.name = name; } public int getValue() { return value; } public String getName() { return name; } } public static void main(String[] args) { System.out.println(PayTypeEnum.ALIPAY_APP);//输出:ALIPAY_APP System.out.println(PayTypeEnum.ALIPAY_APP.getValue());//输出:2 System.out.println(PayTypeEnum.ALIPAY_APP.getName());//输出:支付宝app }