Comparable und Comparator Vertrag in Bezug auf null
Comparable
Vertrag gibt an, dasse.compareTo(null)
muss werfenNullPointerException
.
Vondie API:
Beachten Sie, dassnull
ist keine Instanz einer Klasse unde.compareTo(null)
sollte ein @ werfNullPointerException
obwohle.equals(null)
kehrt zurückfalse
.
Auf der anderen Seite,Comparator
API erwähnt nichts darüber, was beim Vergleichen passieren mussnull
. Betrachten Sie den folgenden Versuch einer generischen Methode, die ein @ annimmComparable
und geben ein @ zurüComparator
dafür, dass setztnull
als minimales Element.
static <T extends Comparable<? super T>> Comparator<T> nullComparableComparator() {
return new Comparator<T>() {
@Override public int compare(T el1, T el2) {
return
el1 == null ? -1 :
el2 == null ? +1 :
el1.compareTo(el2);
}
};
}
Damit können wir Folgendes tun:
List<Integer> numbers = new ArrayList<Integer>(
Arrays.asList(3, 2, 1, null, null, 0)
);
Comparator<Integer> numbersComp = nullComparableComparator();
Collections.sort(numbers, numbersComp);
System.out.println(numbers);
// "[null, null, 0, 1, 2, 3]"
List<String> names = new ArrayList<String>(
Arrays.asList("Bob", null, "Alice", "Carol")
);
Comparator<String> namesComp = nullComparableComparator();
Collections.sort(names, namesComp);
System.out.println(names);
// "[null, Alice, Bob, Carol]"
So sind die Fragen:
Ist dies eine akzeptable Verwendung einesComparator
, oder verstößt es gegen eine ungeschriebene Regel zum Vergleichen vonnull
und werfenNullPointerException
?Ist es jemals eine gute Idee, überhaupt ein @ sortieren zu müssList
enthältnull
elements, oder ist das ein sicheres Zeichen für einen Konstruktionsfehler?