Comparable コントラクトを満たさず、新しい Timsort アルゴリズムを使用して例外をスローする方法で実装された Comparator が大量にあるため、最近、Java 6 から 7 への移行でいくつかの問題が発生しました。
編集:ユーザー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> {
これは Apache Commons 3 のものであり、null セーフな比較メソッドをObjectUtils
提供します (これを呼び出すとき、以前のチェックのために両方のオブジェクトが null になることはなく、c1.compare(c2) も使用できます)
これにより、"Base"-Comparator の動作が改善されましたか? (これは私が推測しています) そして、比較不可能なオブジェクトに対して値 0 が返されるようになったため、これは基本的に比較可能な契約をカバーすることは正しいですか?