重写 toString 方法应清晰简洁、可读可调试且不暴露敏感信息,采用类名加括号键值对格式,仅包含关键业务字段,安全处理 null 和集合,推荐使用 Lombok @ToString 注解。

重写 toString 方法的核心原则是:**清晰、简洁、可读、可调试,且不暴露敏感信息**。它不是用来展示界面文案的,而是为开发者在日志、调试器、单元测试断言等场景下快速理解对象状态服务的。
包含关键业务字段,避免冗余或内部实现细节
只输出对理解当前对象“是什么”和“处于什么状态”真正有帮助的字段。跳过 getter/setter 生成的模板字段、缓存字段、代理对象引用(如 Hibernate 的 $$_hibernate_*)、或大集合的完整内容(可用长度代替)。
- ✅ 推荐:
User{id=123, name='Alice', email='a@example.com', active=true} - ❌ 避免:
User@1b6d3586[id=123, name='Alice', email='a@example.com', active=true, passwordHash=null, version=1, createdAt=..., updatedAt=..., roles=[Role{id=1}, Role{id=2}]...]
格式统一、结构可预测,便于日志解析和人工阅读
采用类名 + 大括号包裹键值对的格式(类似 Lombok 的默认风格),字段间用逗号分隔,键与值用等号连接。保持空格一致(key=value,不是 key = value),不换行,不缩进。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ✅ 推荐:
Order{orderId='ORD-789', status=SHIPPED, itemsCount=3, totalAmount=299.99} - ❌ 避免:
Order [orderId: ORD-789, status: SHIPPED\nitemsCount: 3](混用符号、换行、不一致分隔符)
处理 null、集合、嵌套对象时要安全且克制
避免 NullPointerException,但也不必深度递归 toString。对可能为 null 的字段,显式写出 null;对集合,优先用 size() 或简写(如 items[3]);对嵌套对象,只输出其 ID 或关键标识,而非调用其 toString()(除非你完全掌控该类且确认无循环引用)。
立即学习“Java免费学习笔记(深入)”;
-
address=Address{id=456, city='Beijing'}→ 可接受(仅关键标识) -
address=Address{...}→ 不推荐(省略内容不可读) -
tags=[Tag{name='java'}, Tag{name='backend'}]→ 冗长,建议改为tags[2] -
profile=null→ 明确,优于跳过或抛异常
不依赖第三方库时,手写要简洁;可借助工具提升一致性
手写推荐使用 Objects.toStringHelper(已废弃,不推荐)或直接字符串拼接(JDK 15+ 可用文本块辅助)。更推荐用 Lombok 的 @ToString 注解——它默认排除 static 和 transient 字段,支持 includeFieldNames = true、exclude、of 精确控制字段,并自动生成安全逻辑。
- Lombok 示例:@ToString(includeFieldNames = true, exclude = {"password", "credentials"})
- 手写示例:
return String.format("User{id=%d, name='%s', email='%s'}", id, name, email);(注意单引号包裹字符串值,避免歧义)

















