惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Y
Y Combinator Blog
博客园 - Franky
D
Docker
B
Blog RSS Feed
M
MIT News - Artificial intelligence
雷峰网
雷峰网
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
GbyAI
GbyAI
Recent Announcements
Recent Announcements
Martin Fowler
Martin Fowler
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MyScale Blog
MyScale Blog
B
Blog
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
WordPress大学
WordPress大学
Vercel News
Vercel News
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News

博客园 - 欢乐豆123

软件设计师考试 - 有限自动机 软件设计师考试 - 排序算法 哈夫曼树以及哈夫曼编码 软件设计师案例题型 - DFD(数据流图) 软件设计师考试 - 二分查找 软件设计师考试 - Gantt图与PERT图(项目管理) 软件设计师考试 - 数据表示(原码、反码、补码、移码) 软件设计师考试 - 上午题型分析 软件设计师考试 - 下午题型分析 软件设计师考试-应用技术 内存溢出问题 常见的算法类型 排序算法的介绍 微信生态梳理 海明码介绍 Elasticsearch 实战:基于 function_score 的搜索与权重排序 Nexus的简单介绍以及如何上传自定义包 设计模式-桥接模式(Bridge Pattern) 设计模式简介 jmeter压测 sdkman-管理多个版本的JDK SpringBoot中使用Aop统一拦截MQ消息处理 项目管理流程以及规范 Java-泛型的使用
踩坑记录 - 数据实体/接口使用Enum类变量
欢乐豆123 · 2026-08-31 · via 博客园 - 欢乐豆123

踩坑记录 - 数据实体/接口使用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 }

    具体的枚举类使用本文不做介绍,这里记录下工作中遇到使用枚举类的踩坑记录。

    某个项目中,生产环境突然报错

image

   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 更适合接住别人。