Comparable
契約は、e.compareTo(null)
をスローする必要があることを指定しますNullPointerException
。
APIから:
null
はどのクラスのインスタンスでもないため、 を返してもe.compareTo(null)
をスローする必要があることに注意してください。NullPointerException
e.equals(null)
false
一方、Comparator
APIは、比較時に何が起こる必要があるかについては何も言及していませんnull
。を受け取り、最小要素としてput をComparable
返すジェネリック メソッドの次の試行を検討してください。Comparator
null
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);
}
};
}
これにより、次のことが可能になります。
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]"
質問は次のとおりです。
- これは の許容可能な使用法ですか、それとも の比較とスロー
Comparator
に関する不文律に違反していますか?null
NullPointerException
List
含まれている要素を並べ替える必要さえあるのは良い考えnull
ですか、それとも設計エラーの確かな兆候ですか?