0

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 が返されるようになったため、これは基本的に比較可能な契約をカバーすることは正しいですか?

4

0 に答える 0