错误码code是int类型好还是String类型好
两种类型各有优缺点,我来对比分析:
对比分析
| 维度 | int 类型 | String 类型 |
|---|---|---|
| 可读性 | ❌ 10001 不直观 | ✅ USER001 直观 |
| 扩展性 | ❌ 数字有限 | ✅ 字符灵活 |
| 模块区分 | ❌ 需要数字分段 | ✅ 前缀区分模块 |
| 前端判断 | ✅ 数字比较快 | ❌ 字符串比较稍慢 |
| 国际化 | ❌ 需额外映射 | ✅ 可直接作为 key |
| 存储空间 | ✅ 占用小 | ❌ 占用稍大 |
实际示例对比
int 类型
@Getter
public enum ErrorCode {
// 用户模块 10000-10999
USER_NOT_FOUND(10001, "用户不存在"),
USER_PASSWORD_ERROR(10002, "密码错误"),
// 订单模块 20000-20999
ORDER_NOT_FOUND(20001, "订单不存在"),
ORDER_STATUS_ERROR(20002, "订单状态异常");
private final Integer code;
private final String message;
}
响应示例:
{
"code": 10001,
"message": "用户不存在"
}
String 类型
@Getter
public enum ErrorCode {
// 用户模块
USER_NOT_FOUND("USER001", "用户不存在"),
USER_PASSWORD_ERROR("USER002", "密码错误"),
// 订单模块
ORDER_NOT_FOUND("ORDER001", "订单不存在"),
ORDER_STATUS_ERROR("ORDER002", "订单状态异常");
private final String code;
private final String message;
}
响应示例:
{
"code": "USER001",
"message": "用户不存在"
}
推荐选择
推荐 String 类型
理由:
- 可读性强
看到 USER001 → 立刻知道是用户模块错误
看到 10001 → 需要查文档才知道是哪个模块
- 模块区分清晰
// String 类型 - 前缀区分
USER001, USER002, USER003 // 用户模块
ORDER001, ORDER002, ORDER003 // 订单模块
PAY001, PAY002 // 支付模块
// int 类型 - 数字分段,容易冲突
10001, 10002 // 用户模块?还是系统模块?
20001, 20002 // 订单模块?还是商品模块?
- 国际化友好
// String 类型可直接作为国际化 key
code: "USER001"
i18n.getMessage("USER001") → "用户不存在" (中文)
i18n.getMessage("USER001") → "User not found" (英文)
// int 类型需要额外映射
code: 10001
i18n.getMessage("error." + code) → 需要拼接
- 扩展灵活
// String 类型可以随时加
PRODUCT_STOCK_NOT_ENOUGH("PRODUCT_STOCK_001", "库存不足")
// int 类型需要规划数字段,容易冲突
PRODUCT_STOCK_NOT_ENOUGH(40001, "库存不足") // 40000段够用吗?
大厂实践
| 公司 | 类型 | 示例 |
|---|---|---|
| 阿里 | String | BIZ001, USER001 |
| 腾讯 | String | ERR_USER_001 |
| 字节 | String | 10001(但用字符串存储) |
| 支付宝 | String | ACQ.TRADE_NOT_EXIST |
最终建议
@Getter
public enum ErrorCode {
// ==================== 系统 SYS ====================
SUCCESS("0", "成功"),
SYSTEM_ERROR("SYS001", "系统异常"),
PARAM_ERROR("SYS002", "参数错误"),
// ==================== 用户 USER ====================
USER_NOT_FOUND("USER001", "用户不存在"),
USER_PASSWORD_ERROR("USER002", "密码错误"),
// ==================== 订单 ORDER ====================
ORDER_NOT_FOUND("ORDER001", "订单不存在"),
ORDER_STATUS_ERROR("ORDER002", "订单状态异常");
private final String code;
private final String message;
}
总结:推荐 String 类型,可读性、扩展性、国际化都更好。

浙公网安备 33010602011771号