包私有(default)权限通过“同包可见”实现模块内高内聚协作,对外完全隐藏:包私有类不被外部继承或实例化,方法字段免getter/setter直接访问,构造器控制创建入口,包结构即模块契约边界。

Java 中通过包私有(即 default,不写任何修饰符)权限实现模块内部协同,核心是利用“同包可见”这一边界,让类、方法、字段只在本模块(对应一个包)内自由协作,对外则完全不可见——既避免了 public 的泛滥暴露,又比 private 更灵活,适合模块内高内聚的协作场景。
包私有类:模块骨架不外泄
把框架核心抽象类或工具类声明为包私有,外部包无法 import,也无法继承或实例化。它只服务本包下的具体实现和门面类。
- 例如支付模块中定义 abstract class PaymentStrategy 不加任何修饰符,仅
com.example.pay包内的AlipayStrategy和WechatStrategy能继承它;外部模块哪怕想复用逻辑,也因编译失败而被拦住。 - 这种设计天然划分职责:包内负责“怎么做”,包外只关心“做什么”。门面类(如
PaymentService)用public方法对外提供能力,内部调用的全是包私有类型。
包私有方法与字段:内部协作无阻碍
类中那些仅用于模块内流程衔接、状态传递或调试支持的成员,设为包私有,比 private 更合理——它允许同包下其他类直接访问,省去冗余的 getter/setter,提升协作效率。
- 比如订单处理器中有个
OrderContext context字段,多个策略类需读写它,设为包私有后,ValidationStep和NotifyStep可直接访问,无需暴露 setter 或拆成接口。 - 工具方法如
formatAmount(double)、isRetryable(Exception)若只被本包内服务类调用,也应设为包私有,避免被误用或形成隐式依赖。
包私有构造器:控制对象创建入口
当某个类不应被外部直接 new,但又需要同包内其他类灵活构造时,把构造器设为包私有,是最轻量的控制方式。
- 例如配置加载器
ConfigLoader的构造器不公开,只留一个包私有构造 + 一个public static ConfigLoader of(String path)工厂方法,确保所有实例都经过统一初始化流程。 - 配合 Builder 模式时,Builder 类本身可设为包私有,强制外部只能通过
public static Builder builder()获取构建入口,防止绕过校验逻辑。
包结构即模块契约
包名不是随意起的文件夹名,而是模块边界的显式声明。一个业务模块对应一个顶层包(如 com.example.order),其子包(.core、.adapter、.domain)仍属同一“包域”,共享包私有可见性。
- 跨模块调用必须走 public 接口(如 Spring 的
@ServiceBean 或明确的 API 类),不能靠 import 同包类“抄近道”。 - 若发现某类需被多个包使用,说明它已超出当前模块职责——要么提取为独立模块并提供 public API,要么重构包结构,而不是简单改成 public。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











