包访问权限是隔离组件内部非公开实现的天然屏障,因其将可见性与物理组织绑定,编译器和jvm在语言层面强制执行,既轻量又可靠。

包访问权限之所以是隔离组件内部非公开实现的天然屏障,关键在于它把“可见性”和“物理组织”绑定在了一起——同一个包,才可能协作;不同包,自动屏蔽。
这种设计不依赖额外配置或运行时检查,编译器和 JVM 在语言层面就强制执行,既轻量又可靠。
包访问权限天然支持模块内聚
- 同一个业务模块的类(比如订单校验、库存扣减、支付适配)放在
com.example.order包下,它们之间用默认权限声明辅助方法或工具类,彼此可直接调用; - 外部模块(如
com.example.report)即使知道这些类名,也无法访问其默认修饰的字段或方法,连编译都通不过; - 不需要写文档说明“这个类仅供内部使用”,语言机制本身就在传达这层约束。
它比 public + 注释更可靠,比 private + 反射更安全
-
public加注释说“请勿调用”,但别人仍能调,且 IDE 不报错; -
private虽然彻底封死,但会让同包测试、工厂类、构建器等合理场景寸步难行; - 默认权限正好卡在中间:对包内开放,对包外关闭,既保住了测试与协作便利,又杜绝了外部随意依赖。
实际开发中它让封装落地不靠自觉
- 工具类里的解析逻辑(如
parseAmountString())设为默认权限,业务服务类可调,API 控制层不能碰; - DTO 的构造逻辑、Builder 的中间状态字段用默认权限,避免被外部 new 出半成品对象;
- 模块升级时,只要不改包名,原有包内调用不受影响;一旦拆包,编译失败立刻暴露依赖越界,而不是等到运行时报
IllegalAccessError。
它不是最强的防护,但足够日常使用——不需要模块系统(JDK 9+),不依赖 Maven scope 控制,也不引入反射或 SecurityManager 等复杂机制。
一句话:包是代码的行政区划,包访问权限就是它的边界哨卡。











