Java大型项目中访问修饰符是权限分层骨架:字段一律private,敏感字段private+final并配校验getter,方法按协作半径设public/default/protected/private,包结构支撑default隔离,顶层类与构造器须严守public/default/protected约束。

大型 Java 项目中,访问修饰符不是语法选择,而是权限分层体系的骨架。它把“谁可以看、谁可以改、谁可以继承”固化进编译期约束,避免靠文档或约定来守边界。
字段一律 private,暴露必有契约
所有成员变量默认加 private,不因“暂时没人用”或“只是个 int 计数器”而松动。这是封装的底线。
- 敏感字段(如 password、balance、token)必须 private + final,只提供带校验逻辑的 getter,禁用 setter
- 需外部修改的字段,只暴露带业务校验的 public setter(例如 setAge(int age) 内部校验 0–150),而非开放字段本身
- 纯内部状态(如 retryCount、parseBuffer)连 getter 都不暴露,彻底隔绝外部感知
方法按协作半径设权,不以“方便”为标准
方法的修饰符要映射真实调用关系,而不是图开发顺手。
- public:仅限对外契约点——Controller 接口、Service 主入口、工具类核心静态方法(如 StringUtils.isBlank)
- default(无修饰符):包内协作专用——DAO 辅助方法、DTO 转换逻辑、领域事件发布器,跨包调用直接编译失败
- protected:明确为继承设计——父类定义模板方法(如 doProcess())、钩子(beforeSave()),且 Javadoc 必须注明“供子类重写”
- private:本类私有实现——参数预处理、日志拼接、异常包装,不参与任何跨类协作
包结构是 default 权限生效的前提
default 不是“被遗忘的选项”,而是模块隔离的物理支点。没有合理的包划分,default 就失去意义。
立即学习“Java免费学习笔记(深入)”;
- 每个业务域独立建包,如 com.company.order.entity、com.company.order.infra、com.company.order.app
- 包内复用的工具类、错误码枚举、常量类统一用 default 修饰,禁止加 public
- 杜绝“万能 util 包”(如 com.company.util),否则 default 会意外暴露给无关模块
顶层类与构造器有硬性约束
类和构造器的修饰符不是可选项,而是架构合规的红线。
- 顶层类只能是 public 或 default;public 类必须与文件同名,且一个文件只允许一个
- 构造器通常 public(普通创建)或 protected(仅限子类/框架反射),private 仅用于单例、Builder 内部实例化
- 禁止对非内部类使用 protected 或 private 修饰——IDE 会报错,但规范需提前写进团队手册


















