可比较的合同指定e.compareTo(null)必须抛出NullPointerException。
Note that null is not an instance of any class, and e.compareTo(null) should throw a NullPointerException even though e.equals(null) returns false.
另一方面,Comparator API没有提到当比较null时需要发生什么。考虑以下尝试使用通用方法,该方法接受Comparable,并返回一个将空值作为最小元素的Comparator。
static > Comparator nullComparableComparator() {
return new Comparator() {
@Override public int compare(T el1, T el2) {
return
el1 == null ? -1 :
el2 == null ? +1 :
el1.compareTo(el2);
}
};
}
这使我们可以执行以下操作:
List numbers = new ArrayList(
Arrays.asList(3, 2, 1, null, null, 0)
);
Comparator numbersComp = nullComparableComparator();
Collections.sort(numbers, numbersComp);
System.out.println(numbers);
// "[null, null, 0, 1, 2, 3]"
List names = new ArrayList(
Arrays.asList("Bob", null, "Alice", "Carol")
);
Comparator namesComp = nullComparableComparator();
Collections.sort(names, namesComp);
System.out.println(names);
// "[null, Alice, Bob, Carol]"
所以问题是:
>这是一个比较器的可接受的使用,还是它违反了一个关于比较null和抛出NullPointerException的不成文规则?
>是否是一个好主意,甚至必须排序包含空元素的列表,或者是一个设计错误的确定的标志?