
为什么不能直接 public 一个字段
因为破坏封装性后,后续想加校验、日志、通知逻辑就只能改所有调用方。比如把 age 改成只接受正整数,已有代码里直接赋值 user.age = -5 就完全绕过控制。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 所有非
static final的字段都默认设为private - 连
boolean字段也别用isXxx()以外的命名——否则 Jackson、Spring Data JPA 等框架可能识别失败 - 如果字段是集合类型(如
List<string></string>),getter应返回不可变视图:Collections.unmodifiableList(this.tags),避免外部修改内部状态
lombok @Data 生成的 getter/setter 有哪些隐含行为
它不光生成方法,还影响编译期和运行时行为:比如 @Data 会自动加 @EqualsAndHashCode 和 @ToString,但不会处理循环引用;setter 不做空值检查,传 null 进去就真存了 null。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 敏感字段(如
password)不要用@Data,手动写getter返回"***",不写setter - 用
@Getter(lazy = true)做延迟初始化时,注意生成的字段名是$lzy$xxx,反射或序列化时可能出问题 - 若类被 Jackson 反序列化,确保有无参构造器——
@Data会生成,但加了@RequiredArgsConstructor后就没了
什么时候该拒绝自动生成 setter
不是所有字段都需要可变。比如订单号(orderNo)一旦生成就不该再改;又比如计算属性(fullName)根本没对应字段,只该有 getter。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 只读字段:用
private final+ 手动getter,不写setter - 计算属性:不声明字段,
getter直接拼接或查表,例如return this.firstName + " " + this.lastName; - 带副作用的 setter:比如修改
status时要触发事件,必须手写,并在方法里显式调用publishEvent(new StatusChangedEvent(...))
IDE 自动生成 getter/setter 的陷阱
IntelliJ 默认勾选 “Use ‘is’ prefix for getters of boolean properties”,看着省事,但遇到 Boolean isCompleted(包装类型)就会生成 isCompleted(),而 JavaBeans 规范要求 Boolean 应该用 getCompleted()——某些老框架(如 Struts 1)会因此找不到属性。
实操建议:
立即学习“Java免费学习笔记(深入)”;
- 在 IntelliJ 的
Settings → Editor → Code Style → Java → Code Generation里,取消勾选 “Use ‘is’ prefix…” - 生成前先确认字段类型:基本类型
boolean可用isXxx,包装类型Boolean必须用getXxx - 生成后立刻检查:右键类 →
Go To → Declaration,看方法签名是否符合预期,尤其注意大小写和前缀
真正麻烦的从来不是写不写 getter/setter,而是写完之后没人记得它们是入口点——日志、监控、权限校验,都得从这里插针。漏掉一个,后面排查就是黑盒。










