关键是以语义关系指导继承设计:共性上提、差异下沉,控制在三层以内;用protected final字段+构造注入保障配置一致性;通过模板方法固化流程、预留钩子扩展。

为不同业务模块设计继承体系,关键不是堆砌类,而是用继承表达“模块间语义关系”,把共性逻辑上提、差异逻辑下沉,让每个模块职责清晰、可独立演进。
按业务语义建模,明确 is-a 关系
继承的前提是真实存在的“是一种”关系。比如订单服务、用户服务、支付服务都属于“业务服务能力”,可以抽象出 ServiceModule 作为顶层基类;但不能让 UserService 去继承 PaymentConfig——两者没有语义归属,强行继承只会导致耦合和误用。
- 合理示例:
OrderService extends BusinessService、UserReportGenerator extends ReportGenerator - 不合理示例:
NotificationSender extends DatabaseConnection(这是“有-一个”关系,该用组合)
分层抽象:三层以内收口共性
建议控制在 抽象基类 → 模块父类 → 具体实现类 三层结构内。过深的链路会稀释语义、增加维护成本。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
第一层(抽象基类):如
BaseModule,定义通用生命周期方法(init()、shutdown())、统一日志前缀、配置加载契约 -
第二层(模块父类):如
AsyncProcessingModule或IdempotentApiModule,封装重试、幂等校验、异步回调等横切能力 -
第三层(具体类):如
InventoryDeductService、RefundApplyHandler,只专注自身业务规则和数据操作
用 protected + final + 构造注入保障配置一致性
模块间共享的配置项(如超时时间、重试次数、环境标识)不应散落在各处,而应由基类统一管理并强制初始化。
- 字段声明为
protected final int timeoutMs,子类可读不可改,避免运行时污染 - 基类提供带参构造:
protected BaseModule(Config config),子类必须显式传入配置 - 子类不覆盖配置字段,而是通过构造参数差异化:
new OrderService(config.withTimeout(5000))
配合模板方法+钩子,预留扩展点而不破坏主干
把模块共用流程固化在父类中,把可变环节留作抽象或空实现,让子类只做“填空题”,不做“改卷子”。
- 父类定义
final void execute() { validate(); doBusiness(); notify(); } - 子类只需实现
protected abstract void doBusiness()和可选的protected void afterNotify() { } - 新增一个积分发放模块?只需写新子类,主流程零改动
不复杂但容易忽略:继承体系不是越深越好,也不是越多类越规范。真正有效的模块化继承,是让人一眼看懂“谁是什么、管什么、怎么协作”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










