封装是通过private字段、校验性公共方法、不可变返回值和final设计四重机制保障数据安全:私有字段阻断直连,方法入口嵌入业务校验,集合返回不可变视图,关键属性用final锁定。

封装不是加个 private 就完事,而是用访问控制、校验逻辑和不可变设计,把核心资产数据真正管住——不让乱看,更不让乱改。
私有字段是硬性门槛,切断一切直连路径
把账户余额、库存数量、用户状态等关键字段声明为 private,编译器会直接拦截任何跨类的读写操作。比如:
-
private BigDecimal balance;—— 外部代码写account.balance = new BigDecimal("-1"),编译报错,连运行机会都没有 - 子类也无法绕过,彻底隔绝“顺手改一下”的可能
- 这相当于给数据上了一把物理锁,不是靠提醒,而是靠机制拒绝
公共方法是唯一入口,必须嵌入业务级校验
所有读写都必须走你定义的方法,且每个 setter 都要守住业务底线:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
setBalance(BigDecimal amount)内部判断是否为负、是否超单日限额、是否触发风控规则 -
updateStatus(String status)只允许从“待支付”→“已发货”,禁止跳过中间状态 - getter 也不只是简单返回:可加入访问审计、缓存刷新或权限检查(如非管理员不能查敏感字段)
不交出可变引用,防止外部悄悄破坏内部一致性
如果字段是集合或数组,直接返回原始引用等于开门放人:
立即学习“Java免费学习笔记(深入)”;
- 错例:
public List<String> getTags() { return tags; }→ 外部调用list.add("hacked")就改了内部数据 - 正解:
return Collections.unmodifiableList(tags)或new ArrayList(tags) - 对 Map、数组等同理:返回不可变视图或防御性副本
配合 final 和不可变设计,封死最后一道缝隙
对天生不该变的数据,用 final + 构造时赋值 + 只读接口三重加固:
-
private final String orderId;—— 构造后无法重赋值 -
private final Instant createdAt;—— 时间戳一旦生成即锁定 - 若需暴露,只提供
getCreatedAt(),不提供任何修改途径

















