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

推荐订阅源

aimingoo的专栏
aimingoo的专栏
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
Last Week in AI
Last Week in AI
The Cloudflare Blog
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
S
SegmentFault 最新的问题
量子位
大猫的无限游戏
大猫的无限游戏
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
I
InfoQ
人人都是产品经理
人人都是产品经理
G
Google Developers Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Engineering at Meta
Engineering at Meta

博客园 - mabiao008

mac本地idea启动java项目 idea更新代码时Merge和Rebase区别 CC skill Mac下载免费软件遇到问题解决 CQRS idea2025版本破解 pgsql切换当前会话的模式 java程序中增加mongodb的联合索引 文档启动脚本报错:-bash: ./app.sh: /bin/bash^M: bad interpreter: No such file or directory Milvus索引 pandoc使用 idea把unicode转为中文 idea 插件分享 java项目处理OFD文件 java项目无法读取resources目录下的文件 三种数据对象的区别 Linux环境aspose插件word转pdf中文乱码解决方案 java List报错Method threw ‘java.lang.UnsupportedOperationException‘ exception. 解决 java字段值为null,转json后不存在该字段对应的key 格式化json大文件 springboot项目启动报错Command line is too long. Shorten the command line via JAR manifest or via a classpath file and rerun. com.alibaba.excel.exception.ExcelGenerateException: Can not close IO linux的TCP端口问题 关于linux端口号 linux下生成pdf文件名遇到问题 把页面查询到的数据导出PDF文件(html中的在线表单下载为pdf文件)
错误码code是int类型好还是String类型好
mabiao008 · 2026-05-12 · via 博客园 - mabiao008

两种类型各有优缺点,我来对比分析:

对比分析

维度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 类型,可读性、扩展性、国际化都更好。