java封装需系统性设计访问权限:字段一律private,敏感字段用final或仅getter,校验逻辑置于setter;方法按协作范围选private/default/protected/public;包结构影响default和protected实效。

封装在 Java 中不是简单地把字段设为 private 就完事,而是要结合业务语义、模块边界和继承关系,系统性地分配访问权限。核心是“对外最小暴露,对内合理共享”,让每个成员的可见性与其职责严格匹配。
字段一律用 private,通过方法控制读写
类的属性默认不应被外部直接修改或读取,哪怕只是临时调试也不建议放开。真正需要暴露的数据,应提供明确语义的 getter/setter,并在 setter 中加入校验逻辑:
- 密码、余额、状态码等敏感字段必须 private + final(如不可变)或仅提供 getter
- 订单编号、创建时间这类只读字段,只写 public getter,不写 setter
- 需要校验的字段(如年龄不能为负),setter 内做判断,而非依赖调用方自觉
方法按协作范围选修饰符:包内、继承、公开三档分明
方法的访问权限取决于它服务谁:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 仅供本类使用的辅助逻辑 → private(例如格式化字符串、参数预处理)
- 同一包内多个类共用的工具行为(如 DAO 层缓存清理、DTO 转换)→ 不加修饰符(包私有)
- 设计为被子类重写或扩展的核心流程(如模板方法中的钩子)→ protected
- 对外提供的稳定能力(如 service 接口、工具类静态方法)→ public
避免“自动补全陷阱”:别盲目生成所有 getter/setter
IDE 一键生成的 setter/getter 容易掩盖设计意图。比如:
- 用户实体中
private String password;只应有 private setter(甚至不暴露),绝不能配 public setter - 配置类中
private int maxRetryTimes = 3;若运行时不允许修改,就不该有 setter - 某些字段靠构造器初始化后即锁定(如
private final String id;),getter 合理,setter 违反语义
包结构决定 default 和 protected 的实际价值
权限修饰符不是孤立存在的,它和包组织强相关:
- 把功能内聚的类放在同一包下,default 修饰符就能自然支持包内协作,又防止跨模块误用
- 定义基类时若预期被其他包继承(如框架抽象组件),需将可扩展点设为 protected,而不是 public —— 否则子类无法重写,外部又可能滥用
- public 类名必须与文件名一致,且一个 .java 文件最多一个 public 类;非 public 类可用 default 修饰,适合包内辅助角色
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










