Java封装的核心是构建可控的“数据防线”,即用private锁住关键字段,通过带校验的getter/setter提供受控访问,将复杂逻辑封装为私有方法,并在构造器中完成初始态校验。

Java封装的核心不是简单加个private,而是构建一道可控的“数据防线”——让属性不可直改、访问必经校验、修改有据可依。
用private锁住核心字段
所有敏感或关键状态(如密码、余额、年龄、订单状态)必须声明为private,这是封装的第一道门槛。它切断外部类对字段的直接读写,从语法层面杜绝非法赋值。
- 不要写
public int age;,而应写private int age; - 连同辅助变量(如缓存、计数器、临时标记)也一并私有化,避免被意外干扰
- 注意:
private只限制“访问权限”,不阻止内部逻辑操作——类自身仍可自由读写
通过getter/setter提供受控通道
对外暴露的不是字段本身,而是经过逻辑把关的方法。setter不是“放行开关”,而是“安检闸机”。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 在
setAge(int age)里强制校验范围:if (age 150) throw new IllegalArgumentException(...); - getter也可做处理:返回密码时不是
return password;,而是return "***";或加密后值 - 避免无脑生成getter/setter——只暴露真正需要被外部读写的字段;只读字段可省略setter,只写字段可省略getter
把校验与转换逻辑收进私有方法
复杂规则(如邮箱格式验证、金额四舍五入、状态流转约束)别堆在setter里,应封装为private方法,保持接口干净、逻辑复用、便于单元测试。
立即学习“Java免费学习笔记(深入)”;
- 例如:
private boolean isValidEmail(String email)只在类内调用,外部无法绕过 - 多个setter共用同一校验逻辑时,提取为私有方法可避免重复代码和不一致风险
- 私有方法还可用于数据预处理:如
setPhone(String raw)调用private String normalizePhone(String raw)统一格式
构造器中完成初始态校验
对象一诞生就必须合法。不能依赖外部后续调用setter来“修正”错误状态,应在构造时就守住底线。
- 带参构造器中对传入参数做完整校验,不合法直接抛异常,拒绝创建残缺对象
- 避免在构造器中调用可能被子类重写的方法(防止this逃逸),校验逻辑优先用私有工具方法
- 若需默认值,明确设为合理安全值(如
status = "DRAFT"而非null),而非留空等待外部填充

















