封装是实现高内聚、低耦合最直接、最基础的手段,需通过访问控制、职责收敛和接口抽象,使类自主管理内部状态并最小化对外暴露;属性私有化、校验性访问器、不可变返回、私有辅助方法、业务语义命名、接口隔离依赖、构造注入及工具类外移共同支撑该目标。

封装是实现高内聚、低耦合最直接、最基础的手段。它不是简单地把字段设为 private 加几个 get/set,而是通过访问控制、职责收敛和接口抽象,让类“自己管好自己的事”,同时“只跟外界说最少必要的话”。
属性私有化 + 有节制的访问器
把字段声明为 private 是起点,但关键在“暴露多少、怎么暴露”:
- 只提供真正需要的 getter/setter:比如
userId可能只需getUserId(),而不暴露setUserId()(ID 应由系统生成) - 避免“透明转发”:不要只为私有字段配一个同名 setter 就完事;若业务逻辑要求年龄不能为负,
setAge(int age)就该做校验,而不是放行后由调用方处理 - 优先返回不可变对象:如字段是
List<string></string>,getter 应返回Collections.unmodifiableList(...),防止外部误改内部状态
方法封装:隐藏实现,暴露意图
高内聚体现在类内部逻辑自洽,不依赖外部干预:
- 把辅助逻辑抽成 private 方法:比如订单计算总金额时,拆出
calculateDiscount()、addTax()等私有方法,主流程清晰,细节被收拢 - 对外方法命名体现业务语义,而非技术动作:用
confirmPayment()而非updateStatusToPaidAndSendNotification() - 避免在 public 方法里拼接多个无关操作——那说明这个类正在承担多件事,该拆分
用接口隔离依赖,减少硬绑定
低耦合的关键,是让类只依赖“做什么”,而不是“谁来做”:
- 把可变行为抽象为接口:如发送通知,定义
NotificationService接口,让EmailNotifier、SmsNotifier去实现,业务类只持有一个NotificationService字段 - 构造函数注入依赖:用
public OrderService(NotificationService notifier, OrderRepository repo),而非在类里new EmailNotifier() - 包结构配合封装:把接口与实现分开包,如
com.example.notification放接口,com.example.notification.impl放实现,调用方只依赖前者
工具能力外移,不塞进业务类
一个类如果既要处理订单逻辑,又要格式化日期、脱敏手机号、生成 UUID,它的内聚就已瓦解:
- 把通用能力独立成小工具类:
DateFormatter、SensitiveMasker、IdGenerator - 这些工具类应无状态、无外部依赖,方便复用和单元测试
- 业务类通过组合持有它们(
private final DateFormatter formatter;),而不是继承或复制代码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











