重写 tostring 方法的核心是让对象字符串表示准确、简洁、可读、便于调试;应排除敏感字段,统一格式为 classname[field=value],安全处理 null 和集合,避免递归,推荐用 objects.tostring() 和 string.format(),或 lombok @tostring 注解并测试验证。

重写 toString 方法的核心是让对象的字符串表示**准确、简洁、可读、便于调试**,而不是简单拼接字段。Java 中所有类都继承自 Object,默认的 toString() 只返回类名+哈希码(如 Person@1b6d3586),对排查问题几乎无用。
用 IDE 自动生成 + 手动精修
现代 IDE(IntelliJ IDEA、Eclipse)支持一键生成 toString,但别直接照搬。生成后务必检查:
- 去掉敏感字段:如密码、token、密钥等不应出现在日志或调试输出中;
-
格式统一清晰:推荐用
ClassName[field1=value1, field2=value2]结构,避免换行或冗余空格; -
处理 null 和集合:对可能为
null的引用字段,用Objects.toString(field, "null");对集合建议用Arrays.toString()或list.size()替代完整打印(尤其大数据量时); -
避免递归调用:若字段是其他自定义对象,确认其
toString()已合理实现,否则可能引发栈溢出或无限嵌套。
优先使用 Objects.toString() 和 String.format()
比手动拼接更安全、更简洁。例如:
public String toString() {
return String.format("User[id=%d, name=%s, email=%s, roles=%s]",
id,
Objects.toString(name, "N/A"),
Objects.toString(email, "N/A"),
roles == null ? "[]" : roles.size() + " items"
);
}
这样既避免 NullPointerException,又控制了输出长度和语义。
配合 Lombok 简化(适合常规场景)
如果项目允许引入 Lombok,@ToString 是高效选择:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 加在类上自动包含所有非静态非 transient 字段;
- 用
@ToString(exclude = "password")排除敏感字段; - 用
@ToString(of = {"id", "username"})显式指定字段; - 搭配
callSuper = true可继承父类字段(需父类也重写了toString)。
注意:Lombok 生成的代码在调试时不可见,需确保团队熟悉其行为,且构建环境已正确配置注解处理器。
测试 toString 是否真正可用
写一个简单单元测试验证输出是否符合预期:
@Test
void testToString() {
User user = new User(123L, "Alice", null);
String s = user.toString();
assertTrue(s.contains("User"));
assertTrue(s.contains("id=123"));
assertTrue(s.contains("name=Alice"));
assertTrue(s.contains("email=N/A"));
}
特别是检查 null 值、空集合、特殊字符(如换行、制表符)是否被正确转义或省略。
不复杂但容易忽略:一个好用的 toString 是开发阶段最廉价的调试助手,花两分钟优化,能省下大量查日志的时间。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










