Contrato comparável e comparador com relação a null

Comparable contrato especifica quee.compareTo(null) deve jogarNullPointerException.

Dea API:

Observe quenull não é uma instância de nenhuma classe ee.compareTo(null) deve jogar umNullPointerException Apesar dee.equals(null) retornafalse.

Por outro lado,Comparator API não menciona nada sobre o que precisa acontecer ao compararnull. Considere a seguinte tentativa de um método genérico que leva umComparablee retorne umComparator por isso colocanull como o elemento mínimo.

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);
      }
   };
}

Isso nos permite fazer o seguinte:

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]"

Então, as perguntas são:

Esse é um uso aceitável de umComparatorou está violando uma regra não escrita sobre a comparaçãonull e jogandoNullPointerException?É sempre uma boa idéia ter que classificar umList contendonull elementos ou isso é um sinal claro de um erro de design?

questionAnswers(3)

yourAnswerToTheQuestion