Comparable
contrato especifica que debe lanzar e.compareTo(null)
NullPointerException
.contrato Comparable y Comparator en lo que respecta a null
De the API:
Tenga en cuenta que
null
no es una instancia de cualquier clase, ye.compareTo(null)
debería lanzar unaNullPointerException
A pesar de que los rendimientose.equals(null)
false
.
Por otro lado Comparator
API, menciona nada acerca de lo que debe suceder cuando se comparan null
. Considere el siguiente intento de un método genérico que toma un Comparable
, y devolver una Comparator
por ello que pone null
como el 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]"
Así que las preguntas son:
- Es éste un uso aceptable de un
Comparator
, o es violar una regla no escrita respecto comparandonull
y lanzandoNullPointerException
? - ¿Puede ser una buena idea para tener siquiera para ordenar una
List
que contienen elementosnull
, o es que un signo seguro de un error de diseño?
Nota para los demás que tengan problemas para compilar este código: hay un error en javac, pero se compila y se ejecuta en Eclipse. http://stackoverflow.com/questions/2858799/generics-compiles-and-runs-in-eclipse-but-doesnt-compile-in-javac – polygenelubricants