钩子方法是抽象类中为子类预留的轻量级干预点,不强制覆盖但可微调流程;应置于影响分支或状态变更的关键节点,如beforexxx()、afterxxx()、shouldxxx();需protected字段支持、小动作干预、规范命名与文档。

钩子方法是抽象类中为子类预留的轻量级干预点,不强制覆盖,但一旦重写就能在关键节点微调流程——它不是接管主干,而是“拧一颗螺丝”。核心在于父类定骨架、子类只填空,既保证流程统一,又保留灵活性。
钩子方法该放在哪些位置
不是每个步骤都适合加钩子,得选真正影响分支或状态变更的岔路口:
- beforeXxx():适合参数预处理、日志打点、开关校验(比如修改父类的 isDebugMode)
- afterXxx():适合资源释放、统计更新、结果归档(比如递增 successCount)
- shouldXxx():返回 boolean,直接决定某段逻辑是否执行(比如跳过缓存、绕过权限检查)
父类状态必须对子类可见且可安全修改
钩子要起作用,得能读写父类的中间状态。这要求:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 需要被子类干预的字段,声明为 protected,不能是 private 或 final
- 推荐用可变对象,比如 protected List
customHeaders = new ArrayList(); - 避免在钩子里改不可变对象(如 String、LocalDateTime),否则修改无效
子类覆盖时只做小动作,不破坏主干
钩子不是重写整个步骤,而是配合模板方法精准发力:
- 在 beforeProcess() 中设 timeoutMs = 8000;,而不是自己发 HTTP 请求
- 在 shouldRetry() 中根据响应码返回 true/false,而不是手写重试循环
- 不抛异常、不阻塞线程、不改变模板方法已定义的执行顺序
命名、默认值和文档缺一不可
一个好钩子,得让人一眼看懂怎么用:
- 布尔钩子统一用 shouldXxx() 或 isXxxEnabled() 命名,返回值符合直觉(比如默认 return true; 表示开启)
- 空实现钩子必须是 protected void xxx() { },不能抛 NPE 或静默失败
- Javadoc 明确写清用途,例如:“子类可重写此方法,在序列化前修改字段命名策略”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










