比较器的最佳“通用”实现?

时间:2013-10-17 07:56:32

标签: java comparator comparable timsort

我们最近遇到了一些从Java 6迁移到7的麻烦,因为我们有很多Comparator实现的方式是他们没有完成Comparable合同并使用新的Timsort算法抛出异常。

修改:用户Marco Forberg的输入和班级签名

我现在发现了许多其他人正在扩展的比较器,比较方法看起来像这样:

@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> {

虽然ObjectUtils来自Apache Commons 3,并且提供了一个空安全的比较方法(我知道我称之为时间,因为之前的检查,两个对象都不能为空,我可以使用c1。比较(c2))

这是否改善了“Base”-Comparator的行为? (我假设) 我认为这基本上涵盖了可比较合同,因为现在为不可比较的对象返回值0?

0 个答案:

没有答案