用好访问修饰符是降低耦合度最直接、最基础的手段,核心是通过可见性控制使依赖落在稳定抽象接口上;private 封装实现细节,protected 谨慎用于继承扩展,默认修饰符构建模块边界,public 仅面向契约暴露稳定接口。

用好访问修饰符是降低耦合度最直接、最基础的手段。核心不是“全设成 private 就安全”,而是通过可见性控制,让依赖只落在稳定、抽象、语义明确的接口上,避免把调用方和实现细节绑死。
private 是封装的起点,不是终点
把字段和辅助方法设为 private,能防止外部直接读写或误调用,这是第一步。但仅靠 private 不足以降耦合——它只是“锁住门”,没解决“别人该敲哪扇门”的问题。
- 所有业务字段(如
password、balance)必须 private,改用 getter/setter 或更语义化的方法(如changeEmail()、withdraw(double))暴露行为 - 禁止 public 字段,尤其禁止 public 可变集合(如
public List<order> orders</order>),应返回不可修改视图或提供addOrder()、getOrderCount()等方法 - private 方法只服务本类内部逻辑,不参与协作契约;它的存在与否、参数变化,对外部零影响
用 protected 控制继承边界,不滥用“子类可见”
protected 允许同包类和子类访问,适合做“可扩展但不公开”的设计。但它容易成为耦合隐患——一旦子类依赖了父类的 protected 字段或方法,就等于把实现细节暴露给了继承链。
- 优先用 protected 方法代替 protected 字段;字段尽量 private,方法提供受控访问
- 如果子类需要定制逻辑,用模板方法模式(
final templateMethod()调用protected doSomething()),把扩展点显式定义出来 - 不同包的子类若频繁访问父类 protected 成员,说明职责划分不清,考虑提取公共接口或使用组合替代继承
默认(包级私有)是模块内协作的安全区
不加修饰符的类、方法、字段,只对同包可见。这是构建高内聚模块的天然屏障——你可以在包内自由协作,又天然隔离包外依赖。
立即学习“Java免费学习笔记(深入)”;
- 把一组强相关的类(如
Order、OrderValidator、OrderRepositoryImpl)放在同一包,关键实现类设为默认访问,只暴露OrderService这样的 public 接口类 - 工具方法、DTO 构造器、测试辅助类,若只供本包使用,一律用默认修饰符,避免被外部误引用
- 包名体现领域语义(如
com.example.order.infra),默认访问就成了天然的“模块防火墙”
public 必须面向契约,而非实现
public 是唯一对外暴露的入口,它必须稳定、抽象、无副作用。耦合往往就发生在 public 成员设计不当上。
- public 类只做一件事:比如
UserServiceImpl实现接口,不包含校验、日志、HTTP 调用等横切逻辑 - public 方法签名要语义清晰(如
processRefund(RefundRequest)),避免传入User user, Order order, Payment payment这类多对象参数——这等于把多个类结构暴露出去 - public 接口(如
PaymentProcessor)才是真正的依赖目标,具体实现类(AlipayProcessor)应默认或 private,通过依赖注入交付


















