钩子方法是抽象类中protected的非抽象方法,提供默认或空实现,供子类选择性重写以定制流程;常与抽象方法配合,在模板方法中实现“骨架稳定、行为可扩展”的设计。

抽象类中通过定义钩子方法(Hook Method),可以让子类在不改变主流程的前提下,灵活定制某些步骤的行为。钩子方法本身是空实现或默认实现的模板方法中的可选扩展点,通常配合模板方法模式使用。
钩子方法的定义方式
钩子方法是抽象类中声明为 protected 的非抽象方法,提供空方法体或简单默认逻辑,供子类按需重写:
public abstract class DataProcessor {
// 模板方法:定义固定执行流程
public final void process() {
loadData();
if (shouldValidate()) { // 钩子方法:子类决定是否校验
validate();
}
transform();
save();
afterProcess(); // 钩子方法:子类可插入后置操作
}
// 核心步骤(部分抽象,强制子类实现)
protected abstract void loadData();
protected abstract void transform();
protected abstract void save();
// 钩子方法:有默认实现,子类可选择覆盖
protected boolean shouldValidate() {
return true; // 默认开启校验
}
protected void afterProcess() {
// 默认无操作,子类可重写做日志、通知等
}
// 已实现的通用逻辑(非钩子)
private void validate() {
System.out.println("执行数据校验");
}
}
子类如何利用钩子控制流程
子类继承抽象类后,只重写关心的钩子方法,不影响主流程结构:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 覆盖 shouldValidate() 返回
false,跳过校验步骤 - 重写 afterProcess() 添加邮件通知或清理资源
- 保持其他方法不变,仍走同一套
process()调用顺序
设计钩子方法的关键细节
写出好用的钩子方法要注意以下几点:
- 方法名应语义清晰,如
isRetryEnabled()、getCustomHeaders()、onError() - 始终用 protected 修饰,避免外部调用,只对子类开放
- 避免在钩子方法中抛出未检查异常,除非明确要求子类处理
- 可在钩子方法上加 @Override 注释说明用途,提升可读性
与抽象方法的区别与配合
钩子方法和抽象方法分工不同,常一起使用:
-
抽象方法:必须由子类实现,代表流程中不可省略的核心差异点(如
loadData()) - 钩子方法:可选覆盖,用于微调、开关或扩展,增强灵活性而不破坏契约
- 模板方法内统一调度二者,既保证骨架稳定,又支持行为定制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










