Java封装通过private字段隐藏内部状态,提供带校验的public方法(如setter)间接操作,并防范可变对象引用泄露;更优实践是用行为方法(如deposit/withdraw)替代getter/setter,由类自主管理状态。

Java 通过封装将对象的内部状态(字段)设为 private,仅暴露受控的公共方法(如 getter/setter 或行为方法)来访问或修改状态,从而实现对外部不可见但内部可管理的机制。
用 private 修饰内部字段
这是封装最基础的一步。把代表对象状态的变量声明为 private,阻止外部类直接读写。
- 例如:
private String name;、private int balance; - 外部类无法执行
account.name = "xxx"或System.out.println(obj.balance) - 字段真正“隐藏”起来,不等于消失——它仍存在于对象内存中,只是访问路径被切断
提供有逻辑约束的公共方法
不直接暴露字段,而是通过 public 方法间接操作,可在方法中加入校验、转换、日志等控制逻辑。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- setter 示例:设置年龄时限制范围
public void setAge(int age) { if (age >= 0 && age- getter 示例:返回计算后值而非原始字段
public String getStatus() { return balance > 0 ? "active" : "inactive"; }
避免暴露可变内部对象引用
即使字段是 private,若返回数组、集合或可变对象(如 Date、StringBuilder),外部仍可能绕过封装修改内部状态。
立即学习“Java免费学习笔记(深入)”;
- 错误做法:
public List<string> getItems() { return items; }</string>→ 外部可调用list.add(...)直接改原集合 - 正确做法:
public List<string> getItems() { return new ArrayList(items); }</string>或返回Collections.unmodifiableList(items) - 对日期字段:用
LocalDateTime替代Date;若必须用旧类型,getter 中返回new Date(originalDate.getTime())
用行为方法替代状态暴露
更进一步的设计是:不提供 getter/setter,只提供“能做什么”的方法,让对象自己管理状态变化。
- 例如银行账户不暴露
balance字段,也不提供getBalance(),而是提供deposit(double amount)和withdraw(double amount) - 状态变更完全由类内部控制,外部只触发行为,不关心或不依赖具体数值
- 这样既隐藏了状态,又强化了职责单一和不变性保障

















