应使用 Enum 定义订单状态,避免字符串硬编码;推荐显式字符串值(如 PENDING = "pending"),统一 value 存储、序列化与 API 传输;需保障 Python/Java/DB/OpenAPI/TS 五端值严格一致。
Python 里用
定义订单状态,别再用字符串硬编码
字符串写
、
看似简单,但拼错、大小写不一致、传参时类型不可控,后续加校验或序列化都容易出错。用
能让状态变成“可枚举、可比较、可序列化”的第一类值。
继承
类,每个状态是类属性,值建议用整数或字符串(推荐字符串,语义清晰)
避免用
——它生成的序号和业务含义无关,调试时看不出意图
状态值最好显式声明:
,而不是
,方便日志打印和 API 返回
访问值用
,访问名称用
,别混淆
Java 中
带字段和方法,不是静态常量集合
Java 的
是类,能定义构造器、私有字段、public 方法。把状态描述、对应颜色、是否可取消等逻辑直接封装进去,比散落在 service 里一堆 if-else 更安全。
构造器必须 private,字段建议 final
方法可以返回业务规则,比如
直接在枚举里判断
反序列化时注意:Jackson 默认按 name 匹配,如果前端传的是小写
,得加
或配置
别在 enum 里调用外部 service 或 DB——它不该承担运行时依赖
数据库字段存
的 value 还是 name?选 value(字符串值)
存
(如
)看着“标准”,但一旦重构重命名枚举项,数据库就断连;存
(如
)更稳定,且和 API 传输格式一致,减少转换。
SQL 查询时直接写
,不用查映射表
ORM 映射要显式指定:SQLAlchemy 用
;MyBatis 用
注解
迁移旧数据时,先确认所有代码已支持新 value,再批量 UPDATE,别跳过验证步骤
前端 TypeScript 枚举和后端对齐,别靠人肉同步
前后端状态字面量不一致,会导致接口返回
,前端却只认
,页面卡死或降级成白屏。必须让类型系统强制约束。
用
或
对象生成字面量类型,避免编译后消失
推荐从 OpenAPI/Swagger 自动生成 TS 枚举,比如用
工具,避免手写漏项
后端返回字段名若为
,TS 接口里别写成
就完事——要确保 key 和 value 都和后端 JSON 严格一致
本地开发时 mock 数据,一定要用真实枚举值,别图省事写
最常被忽略的是跨语言一致性:Python enum 的
、Java enum 的
或自定义 getter、数据库字段、OpenAPI 定义、TS 类型——这五处必须一模一样,差一个字母就埋雷。
Enum"pending""shipped"EnumEnumauto()PENDING = "pending"PENDING = 1OrderStatus.PENDING.valueOrderStatus.PENDING.nameenumenumcanCancel()this == PENDING || this == CONFIRMED"shipped"@JsonValueDeserializationFeature.READ_ENUMS_USING_TO_STRINGEnumname"PENDING"value"pending"WHERE status = 'pending'Enum(OrderStatus, values_callable=lambda x: [e.value for e in x])@EnumValue"shipped""SHIPPED"const enumas constopenapi-typescriptorder_statusorderStatusstatus: "xxx".valuename()