应将硬编码集合操作重构为可配置、可复用、有上下文感知能力的工具变量类,如CollectionTool,支持策略插拔、空值兜底、链式组合与按需线程安全。

直接把集合操作写死在业务逻辑里,很快就会变成“改一处、崩一片”的泥潭。真正有效的做法,是把重复的增删查改、排序反转、线程适配等行为,抽成可配置、可复用、可测试的工具变量类 —— 不是简单封装几个静态方法,而是让工具本身具备上下文感知能力。
识别硬编码集合操作的典型信号
以下代码片段出现任意一种,就该考虑重构了:
- 多个 service 方法里反复写
Collections.sort(list)+ 自定义Comparator,且排序逻辑高度相似 - 每次处理用户列表都要手动调用
Collections.synchronizedList(new ArrayList()),但同步粒度不统一 - 分页前总要先
Collections.reverse()再subList(),逻辑耦合严重,无法单独测试 - 空集合判断写成
if (list == null || list.isEmpty())散布各处,某天漏判null就抛NullPointerException
设计工具变量类的核心原则
它不是 Collections 的包装器,而是一个有状态、有策略、可组合的集合行为容器:
-
策略可插拔:比如排序策略不写死在方法里,而是通过
SortStrategy接口注入,支持自然序、按字段、倒序、多级排序等实现 -
空值统一兜底:构造时接受
Collection>,内部自动转为不可变空集合(Collections.emptyList())或防御性拷贝,业务层不再操心null -
行为可链式组合:像
CollectionTool.on(users).sortedBy("age").reversed().paged(1, 20)这样表达意图,而非堆砌命令式调用 -
线程安全按需启用:提供
.asSynchronized()或.asUnmodifiable()等终态方法,避免在中间步骤反复包装
一个轻量但实用的工具变量类示例
不依赖 Spring 或 Guava,纯 JDK 实现:
public class CollectionTool<t> {
private final List<t> data;
<pre class="brush:php;toolbar:false;">private CollectionTool(List<t> source) {
this.data = Optional.ofNullable(source)
.map(ArrayList::new)
.orElseGet(ArrayList::new);
}
public static <t> CollectionTool<t> on(List<t> list) {
return new CollectionTool(list);
}
public CollectionTool<t> sortedBy(Comparator<t> comparator) {
data.sort(comparator);
return this;
}
public CollectionTool<t> reversed() {
Collections.reverse(data);
return this;
}
public List<t> paged(int page, int size) {
int from = Math.max(0, (page - 1) * size);
int to = Math.min(data.size(), from + size);
return data.subList(from, to);
}
public List<t> immutable() {
return Collections.unmodifiableList(data);
}</t></t></t></t></t></t></t></t></t>
}
使用时干净清晰:
var result = CollectionTool.on(userList)<br> .sortedBy(Comparator.comparing(User::getScore).reversed())<br> .paged(2, 10)<br> .immutable();
配套重构动作不能少
只加一个工具类不够,必须同步清理旧习惯:
- 搜索项目中所有
Collections.xxx(...)调用,标记高危点(尤其含null判定、同步包装、多次subList的地方) - 将原生
List参数签名逐步替换为CollectionTool<user></user>,利用编译器强制收敛调用路径 - 为工具类补充边界测试:传
null、空集合、单元素、超大集合,验证行为一致性 - 在 CI 流程中加入检查规则,禁止新增
Collections.synchronized或unmodifiable直接调用











