java集合封装核心是切断外部直接操控权,需用不可变副本返回、深度复制可变对象、语义化增删改方法、接口隔离实现、自定义迭代器解耦遍历逻辑。

Java 中通过封装集合类隐藏内部数据结构,核心不是简单地把字段设为 private,而是切断外部对集合引用的直接操控权,确保所有访问都经过可控、带规则的接口。
用 private 字段 + 不可变副本返回
直接暴露 List 或 Map 引用等于交出修改权限。正确做法是:
- 字段声明为
private List<item> items = new ArrayList();</item> -
getItems()不返回items本身,而是Collections.unmodifiableList(items) - 若集合含可变对象(如
Date、自定义 POJO),getter 中需深度复制或返回不可变包装(如new Date(date.getTime())) - JDK 9+ 可直接用
List.of(...)或Set.copyOf(items)替代传统包装方式,更简洁安全
增删改操作收口到带业务逻辑的方法
不提供裸露的 add(Item) 或 remove(int),而是按场景封装语义化方法:
-
addItem(Item item)中校验库存、重复性、状态是否允许添加 -
removeExpiredItems()自动过滤并清理,而非让调用方遍历后调remove() -
replaceItems(List<item> newItems)</item>统一做全量校验与事件通知,避免逐个操作破坏一致性
用接口隔离实现细节,支持灵活替换
对外暴露的是抽象类型,不是具体集合类:
- 字段类型和返回类型统一用
List<item></item>、Map<string config></string>,而非ArrayList或HashMap - 若需定制行为(如自动排序、缓存、审计),可定义
ItemRepository接口,由不同实现类承载,上层代码无感知 - 集合底层可换成线程安全版本(如
CopyOnWriteArrayList)或懒加载代理,不影响调用方
必要时引入迭代器模式解耦遍历逻辑
当集合结构复杂或遍历有前置条件(如权限、状态过滤)时:
- 不暴露原始集合,而是提供自定义
iterator()方法 - 返回的
Iterator<item></item>内部封装了过滤、分页、延迟加载等逻辑 - 调用方只需用
for (Item item : container),无需知道数据来自内存列表、数据库游标还是远程分片结果
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











