重写 toString 应规范使用 StringBuilder 拼接、仅含业务关键字段、排除敏感与冗余数据、保持格式一致便于日志解析,并谨慎使用 Lombok @ToString。

重写 toString 是 Java 中统一、可读地输出对象信息最直接的方式,尤其在日志打印时能避免默认的 ClassName@hashCode 乱码式输出。关键不是“能不能重写”,而是“怎么重写才规范、安全、易维护”。
用 StringBuilder 拼接,避免字符串拼接性能问题
日志中频繁调用 toString(比如 DEBUG 级别开启时),若用 + 拼接,每次都会创建新字符串对象,影响性能。推荐用 StringBuilder 手动构建:
- 初始化容量合理(如预估 64 或 128),减少扩容开销
- 按字段顺序拼接,字段间用逗号或换行分隔,保持可读性
- 对可能为
null的引用类型字段,用Objects.toString(field, "null")安全转换
只包含业务相关字段,不暴露敏感或冗余数据
toString 是开发和运维排查问题的重要依据,但不是 dump 全部状态。应遵循原则:
- 保留 ID、状态、关键业务属性(如订单号、用户 ID、创建时间)
- 排除密码、token、加密密钥等敏感字段
- 跳过大型集合(如含上千条记录的 List)、二进制内容、循环引用对象
- 若需完整快照,另提供
toDebugString()方法,不替代toString
保持一致性与可预测性,便于日志解析
日志系统常依赖固定格式做结构化提取(如 ELK 中用 grok 解析)。建议:
立即学习“Java免费学习笔记(深入)”;
- 字段名用小驼峰 + 冒号分隔,例如
userId:123, status:SUCCESS, amount:99.5 - 避免换行符(除非明确启用多行日志模式),防止日志平台截断或误切
- 数值、布尔值直接输出原始值;日期统一转为 ISO 格式(
LocalDateTime.now().toString()) - 重写后加 Javadoc 注明格式约定,方便团队对齐
配合 Lombok @ToString(谨慎使用)
Lombok 的 @ToString 能快速生成基础实现,但要注意:
- 默认包含所有非静态非瞬态字段,需用
exclude或includeFieldNames = false控制 - 敏感字段必须显式
@ToString.Exclude,否则有泄露风险 - 复杂逻辑(如脱敏、格式转换)仍需手写
toString,Lombok 不适用 - 上线前检查生成代码,确认无意外字段或 null 异常
不复杂但容易忽略:一次规范的 toString 能让 80% 的日志排查省掉点开 debugger 的步骤。



















