java封装敏感字段的核心是切断直接访问路径并通过受控方法施加业务约束:设为private实现物理隔绝;setter校验输入(如年龄0–150、密码哈希、余额非负);getter脱敏返回(身份证后四位、密码掩码);集合/日期返回不可变副本;关键字段用final锁定。

Java 中封装保护敏感字段,核心是切断直接访问路径,再通过受控方法施加业务约束。不是加个 private 就完事,而是要让字段真正“碰不到、改不了、拿不走”。
把敏感字段设为 private,物理隔绝直连
这是最基础也最关键的一步。只要声明为 private,编译器就会拒绝任何外部类通过点号(.)读写该字段。
-
private String idCard;→ 外部写user.idCard = "123"直接编译失败 -
private BigDecimal balance;→ 即使同包或子类也无法绕过,字段对外“不可见” - 反射虽可强行突破,但需显式调用
setAccessible(true),且默认被安全管理器拦截,生产环境不推荐也不应依赖
用带校验的 setter 控制写入入口
所有修改必须经过你定义的 public 方法,且每个 setter 都要守住业务底线。
- 年龄字段:只接受 0–150 范围,超限抛
IllegalArgumentException - 密码字段:
setPassword(String)中校验长度、大小写字母+数字组合,存储前自动哈希 - 账户余额:
setBalance(BigDecimal)检查是否为负、是否触发风控阈值,非法值直接拒绝 - 状态字段:只允许按流程变更,比如
status从PENDING→CONFIRMED,跳过中间态被拦截
getter 做脱敏处理,不暴露原始数据
读取同样要管控——不是“能看就全给”,而是按需、安全地返回。
-
getPassword()不返回明文,统一返回"***"或空字符串 -
getIdCard()只返回后四位,如"****1234" -
getEmail()可做权限判断:非管理员调用时返回"user@***.com" - 必要时在 getter 中加入审计日志,记录谁在何时查询了敏感信息
防止可变对象逃逸,返回不可变副本
如果敏感字段是集合、数组或日期类,直接返回原始引用等于交出钥匙。
- 错例:
public List<string> getRoles() { return roles; }</string>→ 外部调list.add("ADMIN")就篡改了内部状态 - 正解:
return Collections.unmodifiableList(roles);或return new ArrayList(roles); - 对
Date、Calendar等:getter 中返回new Date(original.getTime()) - 关键字段搭配
final:如private final String userId;,构造时赋值后彻底锁定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











