java私有成员变量必须用private修饰并采用驼峰命名(如username),不可省略修饰符或使用public/protected;需配合校验型setter与无副作用getter,避免lombok盲目生成破坏封装性。

Java 私有成员变量的声明规范
私有成员变量必须用 private 修饰,且推荐使用驼峰命名(如 userName),不能用下划线或大驼峰。不加访问修饰符默认是包级可见,不是私有;用 public 或 protected 就彻底破坏封装性。
常见错误:把变量声明成 public 后直接访问,后续加校验逻辑时得改所有调用点;或者漏写 private,导致子类或同包类意外修改状态。
- 必须显式写
private,哪怕 IDE 默认补全了也要确认 - 避免用基本类型包装类(如
Integer)做可空字段时不做 null 检查就进 setter - 常量用
public static final,不属于这里讨论的“私有成员变量”范畴
手写 getter/setter 的关键细节
IDE 自动生成的代码往往够用,但手动写或审核时要注意:getter 不该有副作用,setter 应做必要校验。比如 setAge(int age) 至少该拒绝负数,否则对象可能进入非法状态。
典型陷阱是 setter 中直接赋值却不克隆可变对象——如果传入的是 ArrayList,外部仍能通过原引用修改内部数据。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- getter 返回基本类型或不可变对象(如
String、LocalDate)可直接返回 - setter 接收可变对象(如
List、Map)时,应做防御性拷贝:this.items = new ArrayList(items) - 不要在 getter 里加日志或计算逻辑,这会让调用方误判性能开销
Lombok 的 @Getter 和 @Setter 怎么用才安全
Lombok 能省掉模板代码,但默认生成的是无参、无校验的 getter/setter。一旦用了 @Setter,就等于把字段裸露给所有调用方,和手写 public 字段风险相当。
更隐蔽的问题是:Lombok 注解对继承不友好。父类加了 @Setter,子类无法阻止某个字段被修改;而手写 setter 至少能控制逻辑。
- 慎用全局
@Setter,优先按需标注单个字段:@Setter(AccessLevel.PROTECTED) - 涉及校验时,必须手写 setter 并去掉 Lombok 注解,否则注解生成的版本会覆盖你写的
- 使用前确认项目已引入 Lombok 依赖且 IDE 插件启用,否则编译报错
cannot find symbol
什么时候不该提供 setter
不是所有私有变量都需要 setter。如果字段只在构造时确定(如 ID、创建时间)、或由内部逻辑推导得出(如 isExpired() 对应的计算结果),暴露 setter 反而让对象状态失控。
常见误用:为方便测试而给所有字段加 setter,结果业务代码也跟着随意修改,最终出现 “ID 被重置” 或 “状态倒流” 等问题。
- 只读字段用
final+ 构造器注入,连 setter 都不声明 - 计算字段(如
fullName)只提供 getter,不设对应字段,每次调用实时拼接 - 集合类字段(如
orders)通常只提供addOrder()这类语义化方法,而非setOrders()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










