接口隔离原则要求用多个细粒度接口替代臃肿总接口,如拆分flyable、swimmable等;抽象类封装共性逻辑,避免default方法滥用;接口声明能力,抽象类提供骨架,二者组合协作。

接口隔离原则(ISP)的核心是“用多个专门的接口,而不是一个臃肿的总接口”,它要求客户端只依赖自己真正需要的方法。在 Java 中,这个原则不是靠某一种语法强制实现的,而是通过合理选择和组合接口与抽象类来落地。
用细粒度接口替代大而全的接口
避免定义类似 Animal 这样包含 eat()、fly()、swim()、run() 的“全能接口”。狗不需要飞,鱼不能跑,硬让它们实现所有方法,就违背了 ISP。
- 拆成
Flyable、Swimmable、Runnable等独立接口 - 让
Bird实现Flyable和Swimmable(比如企鹅),Dog只实现Runnable - 每个接口只表达一个明确的能力契约,方法数量少、职责单一
抽象类用于收敛共性逻辑,不破坏接口粒度
当多个实现类有重复代码(比如日志、校验、模板流程),不要把这些逻辑塞进接口的 default 方法里——那会让本该轻量的接口变重,也容易模糊“能力契约”和“实现复用”的边界。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 把公共行为提取到抽象类中,比如
AbstractPaymentProcessor封装通用支付流程 - 让具体支付类(
AlipayProcessor、WechatProcessor)继承该抽象类,并各自实现关键抽象方法 - 同时,它们仍可实现
Refundable、AsyncCapable等细粒度接口,保持能力声明的清晰性
默认方法要克制,仅用于向后兼容或极简通用行为
Java 8+ 允许接口提供 default 方法,但不能因此把接口变成“半抽象类”。滥用 default 方法会悄悄扩大接口职责,违背 ISP 的初衷。
- 适合放:纯工具性、无状态、极少变更的行为,比如
logTransaction()或isValid() - 不适合放:涉及业务规则、依赖外部服务、可能被子类定制覆盖的逻辑
- 一旦发现 default 方法开始分支判断或调用其他 service,说明它已超出接口范畴,该移到抽象类或策略类中
组合优于继承:用接口声明能力,用抽象类提供骨架
真实系统中,一个类往往既需要“能做某事”的契约,又需要“如何起步”的支持。这时,接口和抽象类不是二选一,而是协作关系。
- 例如报表导出模块:
Exportable接口声明export()能力;AbstractExporter提供文件生成、编码处理、异常包装等骨架 - 具体类如
PdfExporter同时extends AbstractExporter并implements Exportable - 这样既满足 ISP(能力接口干净),又复用实现(抽象类专注流程),还不影响多实现(比如再加个
Printable接口)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










