Java访问修饰符在架构设计中核心是用private锁死内部状态、public定义契约接口、package-private划分模块边界、protected仅限继承扩展。private确保编译期拦截非法访问,public封装完整业务逻辑,默认修饰符支撑包内协作,protected专用于子类可重写钩子。

Java 访问修饰符在架构设计中隐藏实现细节,核心是用 private 切断外部对内部状态的直连路径,再通过受控的 public 接口 暴露能力——不是不给用,而是只允许按规则用。
用 private 锁死字段和辅助逻辑
把类的核心数据(如账户余额、用户密码、缓存状态)和仅本类使用的工具方法全部声明为 private。编译器会在编译期直接报错任何跨类访问,从语言机制上杜绝“绕过校验直接赋值”或“误读中间状态”。
- 字段私有化后,外部无法读写 balance、password、configMap 等敏感变量
- 内部 helper 方法(如
validateEmailFormat()、encryptToken())设为 private,避免被误调或滥用 - 即使同包或子类也不能访问,真正实现“仅当前类可见”的边界
用 public 接口定义契约,而非暴露结构
对外只提供清晰、稳定、带语义的 public 方法,比如 deposit()、changePassword()、exportReport()。这些方法封装了完整业务逻辑,调用方不需要知道内部怎么查库、怎么加锁、怎么拼 SQL。
- 接口名体现意图,不暴露技术细节(例如用
sendNotification()而非callSmsApiWithRetry()) - 参数和返回值保持抽象(如返回
Result<order></order>,而不是裸的JSONObject或Map<string object></string>) - 内部可随时替换实现:把数据库换成 Redis、把同步调用改成消息队列,只要接口行为不变,上层完全无感
用 package-private(默认)划分模块边界
在分层架构中(如 domain / infrastructure / application),把仅供本模块内协作的类、工厂、适配器设为 默认访问权限(不加任何修饰符)。它们对其他模块不可见,但又比 private 更灵活——可在包内自由组合复用。
立即学习“Java免费学习笔记(深入)”;
- 例如:
JpaUserRepository和UserEntity放在infra.user包下,不加修饰符,对外不可见;但包内 Service 可直接使用 - 避免为了“方便测试”而把本该隐藏的类设为 public,也避免因过度 private 导致包内协作困难
- 配合模块化(Java 9+ Module System)能进一步收紧跨模块依赖
protected 用于可控继承,不用于暴露
protected 不是“半公开”,而是“留给子类扩展的钩子”。它只在继承体系内开放,且应明确设计为可重写、可增强的行为点(如模板方法中的 beforeSave()),而非让外部随意调用的接口。
- 父类中定义
protected void onStatusChange(Status old, Status new),供子类定制通知逻辑 - 不把核心业务方法设为 protected——那等于向所有子类开放修改入口,破坏封装稳定性
- 不同包的非子类依然无法访问,所以它仍是“有边界的暴露”,不是松散的 public


















