抽象类通过protected方法暴露扩展点:用protected abstract强制子类实现关键逻辑,用空实现的protected钩子方法提供可选定制,用protected工具方法封装复用逻辑,并配合final模板方法锁定执行顺序。

在抽象类中用 protected 方法向子类暴露扩展点,核心是“控制可见范围 + 明确职责边界”:既不让外部调用干扰流程,又给子类留出安全、可预期的定制入口。
用 protected 抽象方法强制子类实现关键逻辑
这是最直接的扩展方式。父类定义流程骨架,把必须由子类决定的行为声明为 protected abstract,确保编译期就约束住实现责任。
- 比如一个报表生成器,固定流程是“加载数据→校验→渲染→导出”,其中“怎么加载数据”因数据源而异,就定义:
protected abstract List<reportdata> loadData();</reportdata> - 子类必须实现该方法,否则无法实例化;父类模板方法中统一调用,不关心具体实现细节。
用 protected 钩子方法提供可选覆盖点
不是所有扩展都需要强制实现。对那些“有更好,没有也不影响主流程”的环节,用带空实现的 protected 方法作为钩子。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如在处理前后插入日志或清理动作:
protected void beforeProcess() {}protected void afterProcess() {} - 子类按需重写其中某一个,不影响其他子类行为;父类模板方法中统一调用,保持结构一致。
用 protected 工具方法封装复用逻辑
子类常需要共享一些辅助能力(如加密、脱敏、HTTP 调用),但又不适合公开给外部使用。把这些方法设为 protected,既避免污染 public API,又让子类能直接复用。
- 比如:
protected String maskPhone(String raw) { return raw != null ? "***" + raw.substring(7) : null; } - 子类在重写业务方法时可直接调用,无需重复写脱敏逻辑;外部类无法访问,保障封装性。
配合 final 模板方法锁定执行顺序
扩展点再灵活,也不能破坏主干流程。把调用这些 protected 方法的外壳方法设为 final,从语法层面防止子类篡改步骤顺序。
- 例如:
public final void execute() { beforeProcess(); loadData(); validate(); render(); afterProcess(); } - 子类只能通过重写
beforeProcess()或loadData()来影响行为,不能跳过校验或颠倒渲染和导出顺序。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










