重写tostring需保持语义一致性、避免冗余、明确归属层级:以子类名开头,仅补充本层关键字段,安全处理null与集合,推荐用lombok@tostring(callsuper=true, exclude={})精准控制。

继承关系中重写 toString 方法,关键在于**保持语义一致性、避免信息冗余、明确归属层级,同时兼顾可读性与安全性**。它不是简单拼字段,而是要让打印结果一眼能看出“这是哪个类的实例”以及“它的核心状态是什么”。
明确类身份:用当前类名 + 大括号格式
不要沿用父类名称或省略类名。即使子类只新增一个字段,也要以子类名开头,体现真实类型。
- ✅ 正确:
AdminUser{id=101, name='Alice', role='ADMIN', lastLoginTime=2026-09-14} - ❌ 错误:
User{id=101, name='Alice', role='ADMIN'}(丢失子类标识)或{id=101, name='Alice'}(无类名,无法区分类型)
只包含本层关键字段,不重复父类已表达的信息
若父类已输出 id 和 name,子类无需再写一遍;只需补充自己独有的、对理解其身份/状态起决定作用的字段。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 父类
User的toString已含id、name、email - 子类
AdminUser只需加role和lastLoginTime—— 这两个字段定义了“它为什么是 Admin” - 避免:
AdminUser{id=101, name='Alice', email='a@x.com', role='ADMIN', lastLoginTime=...}(email属于父类职责,且未必是 Admin 的关键判据)
安全处理继承链中的 null 和集合
子类字段可能为 null,父类字段也可能在运行时为 null(如延迟加载的关联对象)。统一用显式 null 表示,不跳过、不转空字符串。
-
role=null比role=''或直接省略更准确 - 对集合字段(如
permissions),用permissions[5]表示大小即可,不展开内容;若为空,写permissions[0] - 不调用父类 getter 做额外逻辑(如触发 Hibernate 初始化),除非你确认该 getter 是纯读取且无副作用
推荐用 Lombok @ToString 配合 exclude 和 callSuper
手动维护继承链中的 toString 易出错。Lombok 可自动整合父类字段,并精准控制可见性:
-
@ToString(callSuper = true):自动包含父类toString输出(前提是父类也规范重写了) -
@ToString(exclude = {"password", "credentials"}):在子类中排除敏感字段,即使父类没排除也能补救 - 避免
@Data全量覆盖 —— 它会忽略继承关系,把父类字段当成本地字段重复输出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










