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 unComparable
y 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 unComparator
o 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?