内联类是将无独立价值的轻量类(如仅含字段和getter/setter、仅被一个类使用)的字段与方法直接合并入主类,以降低协作成本;需确认其无隐性职责后再执行复制字段、内联方法、删除类等安全步骤。

将类内联(Inline Class)不是“把类塞进另一个类”,而是**识别出一个本不该独立存在的类,将其职责和数据直接合并回主类中**。它的核心目标是消除过度拆分带来的协作成本——当一个类只被一个其他类频繁使用、自身几乎没有独立行为或复用价值时,保留它反而增加理解负担和维护跳转。
什么情况下该考虑内联类?
以下信号说明这个类可能“太轻”了:
- 该类只被一个类实例化和调用,且从不作为参数传递给其他模块
- 它只有几个字段 + 对应的 getter/setter,没有业务逻辑方法(比如不校验、不转换、不组合)
- 每次使用它,都要先 new 一下再取字段,像
order.getAddress().getStreet(),而 address 本身不参与任何地址计算或格式化 - 它的命名只是主类名词的派生,比如
CustomerData、OrderInfo、UserProfileDto,且没有明确边界(如不涉及序列化策略、权限控制或领域规则)
内联前的关键判断:它真是“数据容器”吗?
别急着删。先确认它是否已承担隐性职责:
- 检查构造函数:是否做了字段校验、默认值填充、格式标准化(如电话号去空格)?有则不宜内联
- 检查 getter/setter:是否封装了计算逻辑(如
getFullName()拼接姓和名)、是否做了访问控制(如仅管理员可读邮箱)?有则保留 - 搜索调用点:是否在日志、序列化、单元测试中被单独 mock 或断言?若大量测试依赖其存在,内联需同步改测试
安全内联的操作步骤
以 Java/C# 为例,按顺序操作可避免遗漏:
- 将目标类的所有字段(含 private 字段)复制到主类中,并调整访问修饰符(如原为 private final,现改为 private)
- 将目标类所有 getter 方法体直接内联为主类中的表达式(如把
address.getCity()改成this.city),setter 同理 - 删除目标类的构造器调用,改用主类字段赋值(如原
new Address("A", "B")→ 直接设this.street = "A"; this.city = "B";) - 删掉目标类文件,清理所有 import 和未使用的引用
- 运行测试,重点验证字段赋值、空指针、序列化兼容性(如 JSON 字段名是否变化)
替代方案比内联更合适?
如果发现这个类虽小但确有语义价值(比如 Money、Email、PhoneNumber),内联反而是倒退。此时应:
- 用 以对象取代基本类型 强化其行为(如
money.add(another)、email.isValid()) - 确保它不可变(immutable),避免字段裸露带来的状态污染
- 让它实现通用接口(如
Comparable、ToStringable),提升复用性










