我们最近在从 Java 6 迁移到 7 时遇到了一些麻烦,因为我们有大量的 Comparator 以一种无法满足 Comparable 合约并使用新的 Timsort 算法抛出异常的方式实现。
编辑:来自用户 Marco Forberg 的输入和类签名
我现在发现了一个 Comparator 许多其他的扩展,比较方法看起来像这样:
@Override
public int compare(final T o1, final T o2) {
return 0;
}
我把它改成了这个,希望能涵盖大多数情况:
@Override
public int compare(final T o1, final T o2) {
//Case: XOR check for either s1 or s2 being null
if(o1 == null ^ o2 == null){
return (o1 == null) ? -1 : 1;
}
//Case: both are null
if(o1 == o2){
return 0;
}
//Case: Its Comparable!
if(o1 instanceof Comparable && o2 instanceof Comparable){
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
return ObjectUtils.compare(c1, c2);
}
//Case: We don't know (ran for years this way)
return 0;
}
类签名如下所示:
public class MyComparator<T> implements Comparator<T> {
WhileObjectUtils
来自 Apache Commons 3 并提供了一个 null 安全的比较方法(我知道我调用它的时候,由于之前的检查,两个对象都不能为 null,我也可以使用 c1.compare(c2) )
这是否改善了“基础”比较器的行为?(我假设)我是对的,这基本上涵盖了 Comparable 合同,因为现在为不可比较的对象返回值 0?