0

我们最近在从 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?

4

0 回答 0