架构设计中集合参数与返回值的关键契约是:用接口不用实现类,用空集合不用null。参数声明统一用collection或list,返回值优先用collections.emptylist()等不可变空集合,并做好防御性拷贝与泛型约束。

在架构设计中,集合的参数与返回值不是“能用就行”的细节,而是影响系统可演进性、协作效率和长期维护成本的关键契约。核心就两条:用接口不用实现类,用空集合不用 null。
参数声明统一用 Collection 或 List 接口
所有 public 方法的集合入参,必须声明为 Collection
- 需要遍历或顺序处理?用 List
- 只关心是否包含、去重或批量操作?用 Collection
- 明确不需要修改集合内容?可加 final 修饰(如 final List
names) - 避免用 Object、Map、Set 等泛化类型——它们掩盖真实意图,增加理解成本
返回值优先返回不可变空集合或不可修改视图
方法内部构造并返回集合时,绝不返回 null。若无数据,返回 Collections.emptyList()、Collections.emptySet() 等轻量空集合;若需防止外部误改,用 Collections.unmodifiableList(list) 包装后返回。
- 空集合比 new ArrayList() 更省内存,且线程安全
- unmodifiableXxx() 是防御性封装,避免调用方意外修改你内部持有的集合引用
- 如果原始集合可能被异步修改,返回副本更稳妥:new ArrayList(original)
- 不要返回 Arrays.asList() 的结果——它是固定大小的,add/remove 会抛 UnsupportedOperationException
DTO 和服务接口中集合字段要深拷贝或只读封装
在跨层(如 Controller → Service → DAO)或跨进程(如 Dubbo 接口)传递含集合的对象时,集合字段不能直接暴露可变引用。
- Setter 中接收集合参数,要做防御性拷贝:this.items = new ArrayList(items)
- Getter 返回集合时,不直接 return this.items,而返回 Collections.unmodifiableList(this.items)
- Dubbo 接口的 DTO 类中,集合字段推荐用 List
声明,序列化框架(如 Hessian、JSON)会自动处理,无需手动转成 ArrayList - 避免在 DTO 中使用 Set 或 Map 作为顶层集合字段——语义模糊,不如明确用 List
- 或 Map
- 或 Map
泛型必须具体,禁止裸类型或 Object
泛型擦除是运行时机制,但编译期的类型信息是保障安全的关键。所有集合参数和返回值都必须带完整泛型,且类型应具体可读。
- ✅ 正确:List
、Map - ❌ 错误:List(裸类型)、List(失去语义)、Collection>(无法操作元素)
- DTO 字段命名配合泛型:private List
skuList; 而不是 private List - 工具类方法若需泛型灵活,用
声明,如 List filter(List src, Predicate p)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











