java中getter/setter是封装落地关键,需私有字段、规范命名、敏感字段手动处理、setter校验、getter防泄露、合理使用工具。

Java 面向对象设计中,getter 与 setter 不是“加个 public 方法”那么简单,而是封装落地的关键环节。核心目标就一个:让属性的读写可控、可验、可扩、可兼容。
私有字段是底线,别绕过它
所有非 static final 的字段都应声明为 private——这是封装的起点。一旦设为 public 或包级可见,后续加校验、日志、审计、通知逻辑时,就得改所有调用方代码,成本极高。
- 比如 age 字段直接 public,别人就能写
user.age = -5,完全跳过合法性检查 - boolean 类型字段命名要守规范:基本类型用
isXxx()(如isActive()),包装类型 Boolean 必须用getXxx()(如getCompleted()),否则 Jackson、Struts 等老框架可能无法识别 - 敏感字段如 password,不要用 Lombok
@Data自动生成,应手动写 getter 返回"***",且不提供 setter
setter 要做校验,不是简单赋值
setter 是数据入口,必须承担第一道把关责任。不能只写 this.xxx = xxx,而要嵌入业务约束。
- 空值/范围检查:姓名非空、年龄在 0–150、邮箱格式合法
- 状态变更联动:修改 status 时触发事件
publishEvent(new StatusChangedEvent()) - 避免副作用外泄:不要在 setter 里做耗时操作(如查库、发 HTTP),这类逻辑应抽到专门的服务方法中
getter 要防泄露,尤其集合类
返回可变引用等于交出控制权。外部拿到 List 引用后直接 add/remove,内部状态就被悄悄破坏了。
- 错例:
return this.tags;→ 外部可任意修改原始列表 - 正例:
return Collections.unmodifiableList(this.tags);或返回新副本new ArrayList(this.tags) - 计算属性不占字段:fullName、birthYear 这类直接在 getter 里拼接或计算,不声明对应字段
- 只读字段用
private final+ 手动 getter,不写 setter(如 orderNo、createdAt)
用好工具,但别被工具带偏
IDE 自动生成 getter/setter 很方便,但默认配置常埋坑。
- IntelliJ 默认勾选 “Use ‘is’ prefix for boolean”,对 Boolean 字段会生成
isCompleted(),违反 JavaBeans 规范;应在 Settings → Editor → Code Style → Java → Code Generation 中取消该选项 - Lombok
@Data会一并加@EqualsAndHashCode和@ToString,但不会处理循环引用;且 setter 不做空检查,传 null 就存 null - 被 Jackson 反序列化的类,必须有无参构造器:
@Data默认生成,但加了@RequiredArgsConstructor后就没了,需额外补上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











