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

Java 通过 private 修饰符 + 受控访问方法 + 防御性设计 三重机制,在面向对象原则下真正封住变量被随意修改的路径,让对象内部状态不因外部误用、越界或并发而破坏。
用 private 筑起不可逾越的语法隔离墙
把字段声明为 private 不是“建议”,而是编译器强制执行的物理封锁:
- 外部类写
account.balance = -500,编译直接报错——连语法关都过不去 - 同包内其他类、子类、工具类都无法读取
user.password,更别说赋值 - 这和操作系统权限类似:不是靠提醒“别删系统文件”,而是根本没给你
rm权限
所有修改必须走带业务校验的公共方法
开放的入口不是“通道”,而是“安检口”。每个 setter 或行为方法都嵌入校验逻辑:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
setAge(int age)中检查是否在 1–120 范围,超限抛IllegalArgumentException -
withdraw(double amount)中判断余额是否充足、金额是否为正、是否触发风控规则 -
setPassword(String pwd)中拒绝空值、校验强度、自动转为哈希存储,getPassword()返回脱敏字符串(如"***")
防住引用泄露和并发篡改
对可变对象类型(集合、日期、数组),返回原始引用等于交出钥匙:
- 集合字段声明为
private final List<string> tags;</string>,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")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










