错误码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 类型

理由:

  1. 可读性强
看到 USER001 → 立刻知道是用户模块错误
看到 10001  → 需要查文档才知道是哪个模块
  1. 模块区分清晰
// String 类型 - 前缀区分
USER001, USER002, USER003      // 用户模块
ORDER001, ORDER002, ORDER003   // 订单模块
PAY001, PAY002                 // 支付模块

// int 类型 - 数字分段,容易冲突
10001, 10002                   // 用户模块?还是系统模块?
20001, 20002                   // 订单模块?还是商品模块?
  1. 国际化友好
// String 类型可直接作为国际化 key
code: "USER001"
i18n.getMessage("USER001") → "用户不存在" (中文)
i18n.getMessage("USER001") → "User not found" (英文)

// int 类型需要额外映射
code: 10001
i18n.getMessage("error." + code) → 需要拼接
  1. 扩展灵活
// String 类型可以随时加
PRODUCT_STOCK_NOT_ENOUGH("PRODUCT_STOCK_001", "库存不足")

// int 类型需要规划数字段,容易冲突
PRODUCT_STOCK_NOT_ENOUGH(40001, "库存不足")  // 40000段够用吗?

大厂实践

公司类型示例
阿里 String BIZ001USER001
腾讯 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 类型,可读性、扩展性、国际化都更好。

posted @ 2026-05-12 11:23  mabiao008  阅读(5)  评论(0)    收藏  举报