封装的核心是让外部不依赖内部实现,仅依赖稳定接口;通过private隐藏字段与辅助方法,提供语义明确的public方法(如getFinalPrice)、计算属性(如getFullName)及契约一致的接口行为。

Java 中封装隐藏类的内部实现,关键不是靠“看不见”,而是让外部代码**不依赖**那些实现细节。只要接口行为稳定,内部哪怕重写十遍,调用方也不用改一行。
用 private 锁住字段和辅助逻辑
把核心数据、中间变量、算法步骤、缓存容器、数据库连接等全部设为 private。它们只在本类内可见,外部连名字都接触不到。
- 字段如
private double basePrice;、private List<Tag> rawTags;不暴露给外界 - 辅助方法如
private void validatePassword(String raw)、private BigDecimal calculateTax()也不对外公开 - 避免把“排序的第3步”“校验的第2个条件”拆成 public 方法——那等于把手术过程直播给病人
把复杂逻辑收进有语义的 public 方法里
不提供一堆零散操作,而是提供一个说清楚“做什么”的方法。所有计算、校验、IO、缓存都在这个方法体内完成。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如订单类不暴露
discountRate和taxPercent,而是提供getFinalPrice()—— 调用方只问“要付多少”,不问“怎么算” -
setPassword(String raw)内部自动加盐哈希,外部传明文,拿不到原始值,也看不到加密流程 -
sendNotification()可能同时发短信、邮件、站内信,但签名不变、行为一致,调用方无感
用计算属性代替真实字段
有些值根本不该存在内存里,而应该每次按需生成。这样连“数据存在哪”都模糊了,彻底切断外部对存储形态的假设。
立即学习“Java免费学习笔记(深入)”;
- 没有
fullName字段,只有getFullName()拼接firstName和lastName - 不存
isEligible布尔字段,而是isEligibleForPromotion()实时综合判断多个业务条件 -
getSummary()返回 JSON 字符串,内部组装多个子对象,外部当普通字符串用,不关心结构
接口契约比实现更可靠
只要方法名、参数类型、返回类型、抛出异常没变,内部怎么大改都安全。这是封装真正起作用的地方。
- 原来用
ArrayList存标签,后来换成ConcurrentSkipListSet去重+排序,调用方毫无察觉 - 原来本地读配置文件,现在从 Nacos 动态拉取,
getConfigValue(key)行为不变 - 原来同步调支付网关,现在改成发 MQ 异步处理,只要交易号能返回、扣款结果可查,就满足契约

















