核心是将“能不能继承”转为“该不该继承”,严格限制继承深度≤2层,超限须架构评审;优先组合替代继承,基类只暴露契约、不塞默认行为;用工具链(CI检查、IDE警告、类图分析)固化约束。

避免滥用继承导致体系臃肿,核心是把“能不能继承”变成“该不该继承”,用约束代替自由,用组合补足语义断层。
严格限制继承深度,两层封顶
允许 Base → Feature,禁止 Base → Feature → EnhancedFeature → ExperimentalFeature。超过两层时必须走架构评审流程。深层继承会让方法查找路径变长、调试时难以定位来源、子类对父类的隐式依赖成倍增加。实际项目中,超过两层的继承链90%以上都可通过提取中间能力为独立模块解决。
- 所有具体业务类标记为 final(TypeScript 中用
sealed或运行时防御) - CI 流程中接入静态检查(如 ESLint 规则
no-multi-extends或自定义 AST 扫描),自动拦截三层及以上 extends - IDE 提示配置开启 “Inheritance depth warning”,超过2层标黄并附重构建议
优先组合,而非继承
当目标是“添加能力”而非“表达类型归属”时,组合天然更安全。比如要给一个数据类增加缓存能力,不要写 class CachedUser extends User,而是让 User 持有 CacheStrategy 实例。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 定义清晰接口:如
interface Serializer { serialize(): string; } - 能力类不带状态、无副作用,可单独测试和替换
- 构造时注入依赖:
new Chart({ renderer: new CanvasRenderer(), exporter: new PdfExporter() })
父类只暴露契约,不暴露实现细节
臃肿常始于父类悄悄塞进太多“默认行为”。一个基类不应决定日志怎么打、HTTP 超时设几秒、错误是否重试——这些都该由使用者传入或配置。
- 所有可变参数必须通过构造函数或 builder 显式传入,禁用硬编码默认值
- 供子类定制的方法统一加前缀:
onInit()、beforeSave(),并在 JSDoc 标注@protected - 内部状态全私有(
#cache),仅通过受控方法访问,杜绝子类直接改this._items
用工具守住边界,不靠自觉
规范落地不能依赖成员自觉。需将关键约束固化进开发流中:
- 每个新继承关系上线前,必须提交
inheritance-map.md,说明继承动因与覆盖点 - 单元测试强制覆盖:
super.method()是否被调用、重写方法是否生效、错误路径是否降级 - 定期跑类图分析脚本,识别“扇出过高”(一个父类被20+子类继承)、“空实现泛滥”(多个子类只重写一两个空方法)等退化信号
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










