模板方法必须用final修饰,以锁住算法执行顺序、防止子类篡改流程骨架;被其调用的步骤方法(如abstract核心步骤、protected默认实现、hook钩子)则不可声明为final,需保持可重写性。

模板方法必须用 final 修饰,核心目的是锁住算法执行顺序,确保子类无法改变流程骨架。
为什么模板方法要声明为 final
模板方法封装的是「不变的步骤顺序」,比如「连接数据库 → 执行查询 → 关闭连接」。如果它不是 final,子类可能重写整个方法,把顺序改成「关闭连接 → 执行查询」,直接导致逻辑崩溃。final 从编译层面禁止覆盖,强制控制权始终在父类手中。
哪些方法不该设为 final
被模板方法调用的步骤方法,必须保持可重写性,否则子类无法定制行为。这些方法通常按以下方式设计:
- 用 protected abstract 声明必须实现的核心步骤(如
doQuery()、closeResource()) - 用 protected 提供带默认实现的辅助方法(如日志记录、参数校验),子类可选择覆写或直接复用
- 钩子方法(hook)也用 protected + 空实现,不强制重写,但允许子类介入流程时机
常见错误写法
以下做法会破坏模板方法模式的设计意图:
- 把模板方法本身设为 abstract:子类被迫重复写调用顺序,失去“父类定骨架”的意义
- 用普通 public 或 protected 修饰模板方法:子类可随意覆盖,流程失控
- 在模板方法里调用 this 的非 final 实例方法:子类构造未完成时可能触发空指针或未初始化状态
final 修饰的其他配合要点
除了模板方法本身,还有几个关键点需要同步考虑:
- 抽象类不能被实例化,天然防止误用;子类必须实现所有 abstract 方法才能编译通过
- final 不适用于接口——接口无法强制子类实现方法,也不能定义构造器或字段,不适合承载流程控制
- 如果抽象类含静态常量(如超时配置),建议用 public static final 声明,提升可读性和运行效率
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











