Comparable y contrato de comparación con respecto a nulo

Comparable el contrato especifica quee.compareTo(null) debe tirarNullPointerException.

Dela API:

Tenga en cuenta quenull no es una instancia de ninguna clase, ye.compareTo(null) debería lanzar unNullPointerException aunquee.equals(null) devolucionesfalse.

Por otra parte,Comparator API no menciona nada sobre lo que debe suceder al compararnull. Considere el siguiente intento de un método genérico que toma unComparabley devuelve unComparator por eso que ponenull como 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);
      }
   };
}

Esto nos permite hacer lo siguiente:

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

Entonces las preguntas son:

¿Es este un uso aceptable de unComparatoro está violando una regla no escrita sobre la comparaciónnull y tirandoNullPointerException?¿Es una buena idea incluso tener que ordenar unList que contienenull elementos, o es una señal segura de un error de diseño?

Respuestas a la pregunta(3)

Su respuesta a la pregunta