敏感字段必须声明为private,通过getter脱敏、setter校验来强制管控;禁用lombok自动生成,重写tostring需脱敏。

用 private 关键字保护敏感属性,核心不是“不让别人看见”,而是“不让别人绕过规则直接操作”。真正起作用的是把字段设为 private 后,强制所有读写必须经过你控制的入口——也就是 getter 和 setter 方法。
敏感字段必须声明为 private
密码、手机号、身份证号、账户余额这类数据,一旦声明为 public 或包级可见,就等于放弃控制权。外部代码可以直接赋非法值(比如 user.age = -10),或取原始值做不该做的事(比如日志里打印明文密码)。所以第一步就是:所有敏感字段一律 private。
- 正确写法:
private String idCard;、private BigDecimal balance; - 错误写法:
public String password;或默认(包级)访问的String phone;
getter 要做脱敏,不裸奔返回原始值
敏感字段的 getter 不是简单 return,而是按场景动态处理。比如手机号对普通用户返回“138****5678”,管理员才返回完整号;密码字段根本不该提供 getter,或者只返回固定掩码如 "***"。
- 避免:
public String getPassword() { return password; } - 推荐:
public String getPassword() { return "***"; }或干脆不写这个方法 - 手机号示例:
public String getPhone() { return DesensitizeUtil.mobile(phone); }
setter 必须校验,拒绝非法输入
setter 是数据进入系统的守门人。年龄不能为负、邮箱要符合格式、余额不能设为 null —— 这些规则都得在 set 方法里堵住。别依赖调用方自觉,要靠代码强制。
- 年龄校验:
if (age 150) throw new IllegalArgumentException("年龄必须在0-150之间"); - 非空检查:
if (name == null || name.trim().isEmpty()) throw new IllegalArgumentException("姓名不能为空"); - 敏感字段可设为只写或只读:身份证号一般只在构造时赋值,后续不提供 setter
慎用 Lombok,尤其对敏感字段
@Data 会自动生成所有 getter/setter,包括密码、密钥等不该暴露的字段。这类字段必须手动写 getter(返回掩码)、不写 setter,Lombok 无法满足这种差异化控制。
- 密码字段不要用
@Data,改用@Getter+ 手动写getPassword() - 构造器参数校验也别省:用
@Builder时配合@Builder.Default或构造函数内校验 - 重写
toString()时同样要脱敏,避免打印日志泄露敏感信息
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











