接口通过契约定义职责边界,聚焦行为意图而非技术实现,拆分按场景隔离的细粒度接口,并避免泄露线程安全、事务等实现约束。

接口在面向接口编程中隔离核心实现细节,关键不是“隐藏代码”,而是通过契约定义划清职责边界——调用方只看到“能做什么”,完全不知道“怎么做”“用什么做”。这种隔离不靠技术手段加密或封装,而靠设计决策:把行为抽象成稳定接口,把变化逻辑推到实现类里。
用接口声明能力,而非实现路径
接口方法命名聚焦行为意图,避开技术细节。比如写 save(User user),而不是 saveToMysql(User user) 或 saveWithJdbcTemplate(User user)。这样上层业务代码只依赖“保存用户”这个能力,后续换成 MongoDB、Redis 或 mock 实现时,调用方一行代码都不用改。
让实现类承担所有具体依赖
数据库连接、HTTP 客户端、序列化工具等具体技术选型,全部放在实现类内部处理。接口本身不引入任何第三方包,也不暴露构造参数或配置方式。例如:
- 接口 UserRepository 只有 findById(Long id) 和 findAll()
- 实现类 JdbcUserRepository 内部用 DataSource 和 JdbcTemplate
- 另一实现类 MemoryUserRepository 用 ConcurrentHashMap 模拟存储
拆分接口,按使用场景隔离职责
一个“大而全”的接口容易把无关细节暴露给不该知道的模块。比如把查询、修改、导出、审计日志全塞进一个 UserService 接口,会导致调用方被迫依赖它不用的功能。正确做法是按角色拆分:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- UserQueryService:只含 getById()、search()
- UserCommandService:只含 create()、update()
- UserExportService:只含 exportAsCsv()
每个接口只承载一类协作需求,自然就过滤掉了其他实现细节。
避免接口泄露实现约束
接口不应规定线程安全、事务边界、缓存策略等实现特性。比如不要在接口里写 /** @thread-safe */ 或强制方法加 @Transactional 注解。这些属于实现类的内部契约,由具体实现自行保障。接口只承诺“结果正确”,不承诺“怎么保证正确”。


















