我认为发布的原始问题是有效的。因为“Collections.sort(..)”方法具有对传入的 Collection 进行排序的预期副作用,所以如果您想维护原始 Collection,则必须执行以下操作:
List<Bean> beans = service.findBeans();
List<Bean> sortedBeans = new ArrayList<Bean>(beans);
Collections.sort(sortedBeans, new BeanComparator());
return sortedBeans;
在上面的例子中,我们对服务方法返回的 Collection 进行排序可能没什么大不了的。但是,如果我们正在排序的 Collection 是一个方法参数,并且调用者不希望传入的 Collection 被排序怎么办?
我通常更喜欢没有后果的方法。
由于“Collections.sort(..)”影响列表,我必须编写以下代码:
public void doSomethingWithBeansInOrder(List<Bean> beans) {
Collection<Bean> sortedBeans = new ArrayList<Bean>(beans);
Collections.sort(sortedBeans, ...comparator...;
for (Bean bean : sortedBeans) {
.. do something
}
}
我发现“sortedBeans”的定义很难看。
如果“(Collections.sort(..)”(或类似的东西)返回一个新的集合并且不影响传入的集合,我可以写:
public void doSomethingWithBeansInOrder(List<Bean> beans) {
for (Bean bean : Collections.sort(beans, ...comparator...) {
.. do something
}
}
我认为Guava的答案Ordering
是最好的。