抽象类实现高内聚的核心是聚焦本质特征与稳定行为,封装统一流程骨架和通用保障,隔离变化点;只定义“是什么”和“必须做什么”,不硬编码业务规则、不暴露无关方法、成员变量仅限共享状态;通过访问控制(private属性、protected/final方法)和组合优于继承原则,确保职责单一、边界清晰。

抽象类要实现高内聚,核心是让类内部的职责高度相关、边界清晰,不掺杂无关逻辑。它不是“把能放的代码都塞进去”,而是聚焦一类对象共有的本质特征和稳定行为,把变化点隔离出去。
只定义“是什么”和“必须做什么”
抽象类应表达语义契约,而非实现细节。例如审批流程中,ApprovalProcess 抽象类只需声明 abstract Result approve(Req req) 和 abstract void reject(Req req),表明所有子类都具备“可审批”“可驳回”的能力。不写“经理怎么审”“风控查什么”,这些属于子类职责。
- 避免在抽象类中硬编码业务规则(如阈值、渠道、校验字段)
- 不暴露与核心语义无关的方法(如日志格式化、HTTP工具调用)
- 成员变量仅保留真正被所有子类共享的状态(如审批单ID、发起人),而非各子类私有数据
把不变逻辑收进来,把可变逻辑推出去
高内聚不等于“全写在里面”,而是“该在哪就在哪”。抽象类负责封装跨子类一致的流程骨架和通用保障,其余交给子类或组合对象。
- 将统一的日志记录、事务开启、状态前置校验等放入抽象类的具体方法中
- 把差异化的逻辑(如审批条件判断、通知方式、回调地址)设计为
protected模板方法,或通过依赖注入交由策略类处理 - 构造器只做必要初始化(如校验必填参数),不承担业务组装或外部服务获取
用访问控制守住内聚边界
内聚性靠可见性约束来维持。抽象类不是公共工具箱,它的结构应体现“谁该知道什么”。
- 属性全部设为
private,通过受控的 getter 或 protected 方法暴露必要信息 - 具体方法按需使用
protected(供子类复用)或final(禁止覆盖,保障流程稳定性) - 避免 public 工具方法——这类功能更适合抽成独立工具类或静态服务,否则会稀释抽象类的核心语义
配合组合优先,不靠继承堆砌职责
一个抽象类如果开始承担“审批+通知+存档+审计”,就已违背内聚。此时应把通知、存档等拆为接口,由抽象类通过字段组合引入,而不是继承扩展。
- 例如:抽象类持有一个
NotificationService接口引用,子类注入邮件或钉钉实现 - 审计逻辑单独封装为
AuditHandler,抽象类只定义钩子方法onApproved(),由组合对象执行 - 这样每个类仍只专注一件事:抽象类管流程骨架,组合对象管专项能力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











