Comparable
le contrat précise que e.compareTo(null)
doit jeter NullPointerException
.
De l'API :
Notez que
null
n'est pas une instance d'une classe, ete.compareTo(null)
devrait lancer unNullPointerException
même sie.equals(null)
renvoie àfalse
.
D'un autre côté, Comparator
API ne mentionne rien sur ce qui doit se passer lorsque l'on compare null
. Considérez la tentative suivante d'une méthode générique qui prend un fichier Comparable
et renvoie un Comparator
pour celui qui met null
comme élément minimal.
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);
}
};
}
Cela nous permet de faire ce qui suit :
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]"
Les questions sont donc les suivantes :
- Est-ce une utilisation acceptable d'un
Comparator
ou est-ce qu'il viole une règle non écrite concernant la comparaison denull
et en jetantNullPointerException
? - Est-ce que c'est une bonne idée d'avoir à trier un
List
contenantnull
ou est-ce un signe certain d'une erreur de conception ?