《Effective Java 》对使用枚举代替常量的做法推崇备至,专门拿出一篇文章分析使用枚举类的好处,我在实际使用中感受到Enum类的好处可以总结为如下几点:
-
代码简洁,不易和同名类型混淆 ,避免用错
-
符合单一职责。以前将很多的类型都放到一个常量类,不易维护,不符合单一职责。使用枚举类可以将不同字段的枚举分开,避免拓展导致错误
-
容易当字段类型扩展了,但是数据库的COMMENT和实体类的注解不一致且当事人恰好也忘记了正确含义时,如果没有这个字段没有使用枚举类,那就需要撸代码挨个找到使用此字段的所有含义,耗时耗力还胆战心惊。但是使用类枚举类的话只要找到对应枚举类即可
创建枚举类(类命名格式:实体名+字段名+Enum)
public enum BillStatusEnum { NEW(10, "新建"), AWAIT_BILL(20, "待结算"), FINISH_BILL(30, "已完成"); private Integer value; private String text; BillStatusEnum(Integer value, String text) { this.value = value; this.text = text; } public Integer getCode() { return this.value; } public String getMessage() { return this.text; } public static BillStatusEnum getEnum(Integer code) { if (code == null) { return null; } for (BillStatusEnum value : values()) { if (value.getCode().equals(code)) { return value; } } return null; } }
枚举类使用场景1:用作比较、赋值
//获取枚举值用做对比、赋值 int billStatus = 20 ; if(BillStatusEnum.AWAIT_BILL.getCode().equals(billStatus)){ System.out.println("订单状态为"+BillStatusEnum.AWAIT_BILL.getMessage()+",开始处理订单业务。。。"); }
枚举类使用场景2:处理switch case
int billStatus = 20 ; //处理多条件判断 BillStatusEnum billStatusEnum = BillStatusEnum.getEnum(billStatus); switch (billStatusEnum) { case NEW: System.out.println("订单状态为待" + BillStatusEnum.NEW.getMessage() + ",开始处理订单业务。。。"); break; case AWAIT_BILL: System.out.println("订单状态为待" + BillStatusEnum.AWAIT_BILL.getMessage() + ",开始处理订单业务。。。"); break; case FINISH_BILL: System.out.println("订单状态为待" + BillStatusEnum.FINISH_BILL.getMessage() + ",开始处理订单业务。。。"); break; default: System.out.println("订单状态错误"); break; }