访问权限控制是支撑高内聚的底层机制,通过private与package-private限定包内可见性,仅导出1–3个public契约类型,并以包路径显式表达职责边界,杜绝隐式耦合。

访问权限控制是包结构设计中支撑高内聚的底层机制,它不单是语法限制,而是通过可见性边界显式表达“谁该知道什么”,让包内元素自然凝聚、包间依赖清晰可控。
包内用 private + package-private 实现强内聚约束
一个高内聚的包,其内部实现细节应默认对外不可见。Java 的默认(package-private)访问权限正是为此服务:
- 工具类、领域值对象、辅助枚举等只在本包内复用的类型,不加任何修饰符——它们天然属于这个包的“私有语义空间”
- 核心类中的状态字段声明为 private,仅暴露必要的业务方法;这些方法若只被本包其他类调用,就不需要 public ——避免外部误用破坏封装契约
- 例如订单包
com.example.order中,OrderStatusTransition类只被Order和OrderService调用,就设为 package-private,不向外导出
public 接口只暴露稳定契约,不泄露包内结构
包对外提供的能力,必须通过精心设计的 public 类或接口表达,且仅限于该包的职责范围:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。
- 每个包通常只导出 1–3 个关键 public 类型,如
OrderService、OrderRepository、OrderEvent,其余全是包内协作组件 - 禁止把 DTO、实体、策略实现类等直接设为 public 并跨包使用——这会把包内实现细节变成外部依赖,拉低内聚
- 如果发现多个包都在 import 同一个包里的十几个类,说明这个包的职责已泛化,该按业务语义进一步拆分
包路径即职责地图,权限控制强化边界感
包名不是命名习惯,而是模块边界的显性表达;访问权限则让这种边界可执行、可验证:
-
com.example.order.api:只含 public 接口与 DTO,供其他包依赖 -
com.example.order.internal:全为 package-private 或 private,禁止被外部 import - 借助 IDE 的 “Package Dependencies” 图或 Maven 的
maven-enforcer-plugin,可检查是否存在跨包非法访问(如 A 包类直接 new B 包的 internal 类)
避免 default 权限滥用导致隐式耦合
看似安全的 package-private,一旦被用于跨包协作,反而制造隐蔽耦合:
- 两个不同业务包(如
user和order)若靠共享同一个父包(如com.example.common)并使用 default 类通信,实际已形成强依赖 - 正确做法是定义明确的 public 接口(如
UserQueryService),由 user 包提供实现,order 包只依赖接口 - 所有跨包交互必须经过 public 契约,而非靠“同包”钻空子——这才是权限控制对高内聚的真实贡献
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










