接口隔离原则要求将大接口按行为职责拆分为小而专的接口,如Flyable、Swimmable等,避免AllInOne式胖接口;用组合替代全量实现,杜绝UnsupportedOperationException;善用default方法提供可选增强,警惕伪隔离,确保接口间无隐含耦合。

在 Java 面向对象编程中实现接口隔离原则(ISP),核心是让类只依赖它真正需要的方法,不被强迫实现无关功能。关键不是“能不能写”,而是“要不要暴露”——把大而全的接口拆成小而专的接口,让实现类各取所需。
按行为职责拆分接口
一个接口只定义一类动作,比如“能飞”“能游”“能跑”,而不是塞进一个 Animal 接口里。这样 Bird 可以只实现 Flyable 和 Runnable,Fish 只实现 Swimmable,互不干扰。
- 避免写类似
interface AllInOneDevice { print(); scan(); fax(); copy(); }这样的胖接口 - 改为
interface Printable、interface Scannable、interface Faxable等独立接口 - 打印机硬件模块只需实现其中一两个,扫描仪模块只关心
Scannable
用组合代替“全量实现”
当某个类看起来要实现一堆方法,但实际只用其中几个时,说明接口设计已越界。此时应检查是否在用一个接口承载多个角色。例如员工系统中,考勤部门不需要工资计算逻辑,就不该让它实现 calculateSalary()。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 把
Employee拆成AttendanceCapable、PayrollCapable、TaskAssignable - 考勤类只实现
AttendanceCapable,彻底避开无关方法 - 避免出现
throw new UnsupportedOperationException("不支持")这类补丁式实现
善用默认方法控制扩展粒度
Java 8+ 的 default 方法可用于提供通用能力,但不能因此把所有功能都堆进一个接口。它的作用是“可选增强”,不是“强制打包”。
立即学习“Java免费学习笔记(深入)”;
- 比如
Logger接口可定义log(String msg)为抽象方法,logError(String msg)设为 default 方法 - 但不要把
saveToFile()、sendToKafka()、notifySlack()全塞进去 - 真正需要异步推送的模块,应额外依赖
NotificationService这类专用接口
警惕“伪隔离”:接口名细化 ≠ 真正隔离
光把接口起名叫 UserBasicInfo、UserSecurityInfo 不够,还要看方法之间是否存在隐含耦合。如果两个接口的方法总是一起被调用、参数结构高度重叠、变更频率一致,那它们可能本就属于同一职责边界。
- 检查实现类是否频繁同时实现多个小接口——这可能是拆分过细的信号
- 观察测试用例:一个单元测试是否总要 mock 三四个接口才能跑通?说明职责仍纠缠
- 真正隔离的标志是:删掉某个接口,不影响其他模块编译和运行


















