抽象类通过final模板方法固化流操作流程,将加载、转换、校验、保存等环节串联,其中可变行为由子类实现抽象方法,不变逻辑封装为protected辅助方法和字段,并提供空实现钩子支持非破坏式增强。

抽象类通过非抽象方法封装复杂流操作闭环,关键在于把“不变的流程骨架”写死在父类里,把“可变的具体行为”交给子类填空,同时借助受保护的辅助方法和状态管理让整个闭环既稳定又灵活。
用 final 模板方法固化流操作全过程
非抽象方法作为模板方法,必须声明为 final,确保子类不能破坏执行顺序。它按固定节奏串联加载、转换、校验、保存等环节,每个环节调用的是可被子类定制的钩子或抽象方法。
- 比如定义
public final void execute(),内部严格按load() → transform() → validate() → persist()执行 - 其中
load()和persist()可设为protected具体方法,提供默认实现;transform()和validate()设为protected abstract,强制子类实现 - 这样既闭环了整条链路,又不锁死任何业务细节
用 protected 辅助方法复用通用流处理逻辑
非抽象方法不只是模板,还能作为工具箱里的“小零件”,被模板方法或其他子类方法反复调用。这些方法通常带共性能力,比如异常统一包装、日志打点、空值兜底、上下文注入等。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如
protected Result wrapResult(Object data)封装响应结构,所有子类都可直接用,无需重复构造 - 再如
protected Stream<string> safeSplit(String input)</string>处理可能为 null 的字符串切分,避免每处都写判空 - 它们不参与主流程编排,但让每个环节更健壮、更一致
靠 protected 字段 + 构造器完成流依赖的一次性准备
流操作常依赖外部资源——HTTP 客户端、配置对象、缓存连接池。抽象类能用 protected 字段持有这些状态,并在构造器中完成初始化,子类继承即得,不用各自 new 或查找。
- 比如在抽象类构造器中构建
this.httpClient = HttpClient.newBuilder().build() - 子类的
load()方法可直接使用httpClient.send(...),无需关心如何创建或配置 - 字段设为
protected而非private,既保证可见性,又防止子类随意赋值破坏一致性
用钩子方法支持非破坏式增强
有些场景不需要重写核心步骤,只需要在流程前后加点东西——比如记录耗时、发送埋点、清理临时文件。这时用空实现的 protected 钩子方法比强制重写更轻量。
- 模板方法里写
beforeExecute(); doMainWork(); afterExecute(); -
beforeExecute()和afterExecute()默认为空,子类按需覆盖 - 子类只重写其中一个,不影响其他环节,也不用担心漏掉
super.beforeExecute()这类易错调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










