合理分配访问权限是支撑高内聚的关键手段:private 是起点但需配合业务校验;default 用于包内协作;protected 慎用字段,优先暴露受控方法;public 接口须精简、有语义、带防御。

合理分配访问权限是支撑高内聚的关键手段,不是简单套用“private 优先”就能解决的。核心在于:让类内部的状态和行为真正围绕同一业务语义组织起来,而访问修饰符是实现这种组织的约束工具。
private 是起点,但必须配合校验与封装逻辑
把字段设为 private 只是封住了直接访问的门,不代表内聚就成立了。如果 setter 方法只是机械赋值,那状态依然可能非法,类的行为就不可靠。
- 所有 setter 和构造器中对 private 字段的赋值,都应包含业务校验(如年龄范围、邮箱格式、金额非负)
- 校验失败抛出带业务含义的异常,比如 IllegalArgumentException("order status cannot be null")
- 避免在 private 字段上暴露无意义的 getter/setter——只提供业务上真实需要读写的属性
default 权限用于包内高内聚协作
当多个类天然属于同一业务边界(比如订单模块中的 Order、OrderItem、ShippingPolicy),它们之间可以共享中间状态或辅助方法,但对外完全隐藏。
- 把共用的计算逻辑、缓存字段、构建器方法设为 default,仅限 com.example.order 包内调用
- 这样既避免了 public 的泛滥,又比 private 更利于模块内部解耦和复用
- 跨包调用时自动编译失败,是职责边界的硬性提示
protected 要慎用字段,优先暴露受控方法
protected 字段会让子类直接操作父类内部状态,破坏封装性,也容易导致子类逻辑与父类实现细节强绑定。
- 尽量用 protected 方法代替 protected 字段,比如 protected void addTag(String tag) 而非 protected List
tags - 若必须暴露集合类,getter 返回不可修改视图:Collections.unmodifiableList(tags)
- 子类不该知道父类字段名或类型,而应通过语义明确的方法交互
public 接口要精简、有语义、带防御
一个类对外暴露的 public 方法,就是它向世界承诺的唯一能力契约。每个多余的 public 方法,都在稀释它的内聚度。
- 每个 public 方法都应能用主谓宾句描述其业务意图,比如 “生成支付二维码”“校验手机号归属地”
- 返回可变对象(ArrayList、Date、HashMap)时,必须做防御性拷贝或返回不可修改包装
- 拒绝 null 或空白字符串等非法值,比如 getName() 应返回非空字符串,否则抛出 IllegalStateException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











