Java通过private修饰符、受控访问方法和防御性设计三重机制实现真正封装:private强制语法隔离,setter嵌入业务校验,可变对象返回不可修改副本或副本,构造器确保初始合法性且关键字段用final修饰。

Java 通过 private 修饰符 + 受控访问方法 + 防御性设计 三重机制,在面向对象原则下真正封住变量被随意修改的路径,让对象内部状态不因外部误用、越界或并发而破坏。
用 private 筑起不可逾越的语法隔离墙
把字段声明为 private 不是“建议”,而是编译器强制执行的物理封锁:
- 外部类写
account.balance = -500,编译直接报错——连语法关都过不去 - 同包内其他类、子类、工具类都无法读取
user.password,更别说赋值 - 这和操作系统权限类似:不是靠提醒“别删系统文件”,而是根本没给你
rm权限
所有修改必须走带业务校验的公共方法
开放的入口不是“通道”,而是“安检口”。每个 setter 或行为方法都嵌入校验逻辑:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
setAge(int age)中检查是否在 1–120 范围,超限抛IllegalArgumentException -
withdraw(double amount)中判断余额是否充足、金额是否为正、是否触发风控规则 -
setPassword(String pwd)中拒绝空值、校验强度、自动转为哈希存储,getPassword()返回脱敏字符串(如"***")
防住引用泄露和并发篡改
对可变对象类型(集合、日期、数组),返回原始引用等于交出钥匙:
立即学习“Java免费学习笔记(深入)”;
- 集合字段声明为
private final List<String> tags;,getter 返回Collections.unmodifiableList(tags) -
Date类型用return new Date(lastModified.getTime())返回副本 - 数组用
Arrays.copyOf(internalArray, internalArray.length)防止外部通过索引修改 - 多线程场景下,配合
synchronized方法或AtomicInteger等原子类型保障状态一致性
构造阶段就守住合法性底线
对象一出生就必须合法,不能靠后续 setter 补救:
- 构造器中对传入参数做完整校验:负数余额、空用户名、非法邮箱格式全部拦截
- 关键字段用
final修饰(如private final String userId;),确保创建后不可变 - 只读字段不提供 setter,状态变更必须走明确语义的方法(如
confirmOrder()而非直接设status = "CONFIRMED")

















