java中getter/setter是封装落地的关键环节,需显式声明private字段、统一小驼峰命名、getter防御性拷贝可变对象、setter严格校验参数,且按需提供而非机械成对。

Java 中的 getter/setter 不是模板代码,而是封装落地的关键环节。写对不难,但写好需要理解“为什么限制”和“怎么放行”——既要锁住数据入口,又要让外部用得安全、自然。
成员变量必须用 private 显式声明
所有需要保护的数据字段,都得明确加上 private 关键字。省略它、用默认访问(包级)或直接 public,都会削弱封装效果。
- ✅ 正确写法:
private String email;、private int age; - ❌ 隐患写法:
String email;(同包类可随意改)、public double salary;(外部可绕过校验直接赋值) - 命名统一用小驼峰,如
accountBalance、isVerified,不加 m_ 或 $ 前缀
getter 要安全读,不暴露内部引用
getter 只做一件事:返回当前值。但它不是简单 return 字段,尤其当字段是可变对象时。
- 基本类型(
int、boolean)和不可变类型(String、LocalDate)可直接返回 - 集合类(如
private List<string> tags;</string>)必须防御性拷贝:return new ArrayList(tags);或return Collections.unmodifiableList(tags); - 布尔字段推荐用
isXxx(),如private boolean active;→public boolean isActive() - 避免在 getter 中触发日志、网络请求、计算逻辑——调用方无法预料副作用
setter 是唯一入口,必须校验再赋值
setter 是数据进入对象的闸口。它不只是赋值,更是第一道防线。
- 参数名通常与字段名一致,用
this.name = name;区分字段和参数 - 基础校验不能少:空值检查、范围限制(如年龄 0–150)、格式验证(邮箱正则)
- 接收可变对象时做防御性拷贝:
this.items = new ArrayList(items); - 拒绝非法值后,可抛异常(
IllegalArgumentException)或静默处理(如设为默认值),但需保持行为一致
按需提供,不机械成对
不是每个 private 字段都要配齐 get + set。封装的本质是“控制”,不是“填空”。
-
只读字段(如 ID、创建时间):只写 getter,字段可声明为
final,在构造器中初始化 -
只写字段(如密码哈希):提供
setPassword(String),但不暴露getPassword(),防止内存泄露或日志误打 -
计算属性(如
isAdult()):不存字段,getter 内部根据age >= 18动态判断 - IDE 自动生成的 getter/setter 是起点,不是终点——务必人工补上校验与防御逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











