Java封装核心是主动设计访问逻辑:只读字段用public getter+无setter;setter校验参数合法性;getter可设public、setter限protected/package-private实现读写分离;getter还可动态计算、脱敏或延迟加载。

Java 封装通过将字段设为 private,再提供 public 的 getter 和 setter 方法来控制读写权限。核心不是“隐藏字段”,而是“主动设计访问逻辑”——读写是否允许、何时允许、如何校验,全由你写的这些方法决定。
只读字段:用 public getter + 不写 setter
适用于不希望外部修改的属性,比如 ID、创建时间、计算结果等。
- 把字段声明为
private final或仅private - 只提供
public int getId()这类 getter 方法 - 不提供
setId(),或提供但抛出UnsupportedOperationException
例如:
private final String serialNumber;<br>
public String getSerialNumber() { return serialNumber; }外部能读,但无法修改。
带校验的写入:在 setter 中加逻辑判断
避免字段被赋非法值,比如年龄不能为负、邮箱格式需合规、余额不能为负等。
- setter 方法内先做参数检查,再赋值
- 可抛出
IllegalArgumentException或返回布尔值表示是否设置成功 - 不直接暴露字段,所有写入必须经过这一关
例如:
private int age;<br>
public void setAge(int age) {<br>
if (age < 0 || age > 150) throw new IllegalArgumentException("Invalid age");<br>
this.age = age;<br>
}
读写分离控制:getter 公开,setter 限定包内或子类
某些场景下,外部可读但仅限本包或子类可改(如框架内部状态)。
立即学习“Java免费学习笔记(深入)”;
- 字段仍为
private - getter 设为
public - setter 设为
protected或默认(package-private)
这样:同包类或子类能调用 setXxx(),其他包的类只能读,不能写。
延迟/派生值:getter 不直接返回字段,而是计算或加载
读操作本身也可受控——不暴露原始数据,而是返回处理后结果。
- getter 内部可能触发初始化、格式化、权限检查或缓存加载
- 例如:返回脱敏手机号、按用户角色过滤后的列表、首次访问才创建的对象
- 字段本身甚至可以是
transient或完全不存,靠 getter 动态生成
例如:
public String getDisplayName() {<br>
return currentUser.isInternal() ? name : name.replaceAll("(?<=.{2}).(?=.{2})", "*");<br>
}


















