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?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage