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 umComparable
e 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 umComparator
ou 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?