我们最近遇到了一些从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?