封装通过私有方法、内部类和接口工厂隐藏实现细节,对外提供稳定简洁的公共接口,确保调用方只关注输入输出,不感知内部复杂性,同时防止数据泄露和误用。

封装通过将算法实现细节放在私有方法或私有类中,对外只暴露简洁、稳定的公共接口,从而隐藏复杂性。
用 private 方法封装核心逻辑
把计算步骤、条件分支、循环嵌套等复杂过程写在 private 方法里,让 public 方法只负责接收参数、校验输入、调用私有逻辑、返回结果。调用方完全感知不到内部有多绕,只关心“传什么、得什么”。
- 例如:一个 calculateDiscount() 公共方法,内部可能调用 isVIP()、applySeasonalRule()、capMaximumDiscount() 等多个 private 方法,但外部只需写 price.calculateDiscount(100)
- 后续优化算法(比如改用查表法替代多重 if-else)时,只要输入输出行为不变,public 方法签名和调用方式完全不用动
用 inner class 或 package-private 类隔离算法模块
当某套算法特别庞大(如路径规划、加密解密、图像滤波),可单独抽成 private static inner class 或默认访问权限的辅助类。它只对当前类可见,不污染 API,也不被外部误用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如 OrderProcessor 类内定义一个 private static class DiscountEngine,专门处理折扣组合策略;外部连这个类名都看不到
- 若算法需复用,再考虑提升为 package-private(不加修饰符),仅限同包类使用,仍避免暴露给所有调用者
用接口+工厂屏蔽具体实现差异
当存在多种算法变体(如不同排序策略、不同压缩算法),定义统一接口(如 CompressionAlgorithm),把每种实现设为 private 或 package-private 类,并通过工厂方法返回实例。调用方拿到的是接口,不知道背后是 LZ4 还是 Zstd。
- public 方法如 compress(data, AlgorithmType.LZ4),内部根据类型 new 出对应私有实现类,但返回的是接口类型
- 新增算法只需增加一个私有实现类 + 工厂分支,无需修改已有调用代码,也不泄露新类的细节
避免在 public 方法中暴露中间状态或临时变量
不要为了“方便调试”而在 public 方法里暴露循环索引、缓存 map、临时 builder 对象等。这些属于实现痕迹,应严格限制在方法体内或私有辅助方法中。
- 错误示范:public List
- getItemsSortedBy(String field) { ... return items; }
—— 如果 items 是内部缓存且被外部修改,会破坏封装 - 正确做法:返回 new ArrayList(items) 或 Collections.unmodifiableList(items),切断外部对内部数据结构的直接操作
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










