踩坑记录 - 数据实体/接口使用Enum类变量
踩坑记录 - 数据实体/接口使用Enum类变量
Java 枚举(Enum)是一种特殊的数据类型,用于定义一组具有固定值的常量集合。枚举提供了一种更加结构化和类型安全的方式来表示一组相关的常量,使得代码更具可读性和可维护性。
比如:下面的订单状态枚举类
1 public enum OrderStatusEnum { 2 3 /** 4 * 待支付 5 */ 6 WAIT_PAY(0), 7 /** 8 * 支付成功 9 */ 10 PAY_SUCCESS(1), 11 /** 12 * 已完成 13 */ 14 COMPLETED(2), 15 /** 16 * 已取消 17 */ 18 CANCEL(3); 19 20 /** 21 * 订单状态 22 */ 23 private final int status; 24 25 OrderStatusEnum(int status) { 26 this.status = status; 27 } 28 29 public int getStatus() { 30 return status; 31 } 32 }
具体的枚举类使用本文不做介绍,这里记录下工作中遇到使用枚举类的踩坑记录。
某个项目中,生产环境突然报错

1. 分析报错原因
private OrderBizTypeEnum orderBizType;
预发布和生产环境使用的是同一个数据库,Entity 里有个字段直接映射成了 Enum。预发布测试新功能时,写入了一个新的枚举值,而生产环境的代码还没更新,Enum 里并没有定义这个值。结果生产环境查询数据时,ORM 做字段映射,发现这个值转不成当前的 Enum,直接报错了。
2. 解决办法
改用String类型来接收
1 /** 2 * 订单业务类型 3 * 4 * @see OrderBizTypeEnum 5 */ 6 private String orderBizType;
3. 总结
Enum 本身并没有什么问题,反而在业务代码中非常好用,类型清晰,也能避免很多无意义的字符串比较。真正需要注意的是:不要让外部数据直接绑定到 Enum。因为接口、数据库、MQ 这些外部数据源都有一个特点:它们可能比当前服务的代码更新。
今天 Enum 里只有 `A、B` 两个值,明天外部系统可能就传过来了一个 `C`。如果直接用 Enum 接收,程序可能在数据转换这一步就直接报错,业务代码甚至没有机会处理。
所以在使用中更倾向于:边界用 String,业务用 Enum。
先用 String 接住外部数据,再在业务层转换成 Enum。这样既保留了 Enum 在业务代码中的类型安全,也能避免因为一个暂时不认识的值,直接把整个流程打崩。
说到底,Enum 适合约束自己,String 更适合接住别人。

浙公网安备 33010602011771号