pol*_*nts 35 java generics null comparable comparator
Comparable
合同规定e.compareTo(null)
必须抛出NullPointerException
.
来自API:
请注意,这
null
不是任何类的实例,并且e.compareTo(null)
应该抛出一个NullPointerException
偶数e.equals(null)
返回false
.
另一方面,Comparator
API没有提及比较时需要发生的事情null
.考虑以下尝试采用a的泛型方法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);
}
};
}
Run Code Online (Sandbox Code Playgroud)
这允许我们执行以下操作:
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]"
Run Code Online (Sandbox Code Playgroud)
所以问题是:
Comparator
,还是违反了关于比较null
和投掷的不成文规则NullPointerException
?List
包含null
元素进行排序是一个好主意,还是设计错误的确定标志?cle*_*tus 25
Comparable
不允许null
仅仅因为:
a.compareTo(b) == -b.compareTo(a)
Run Code Online (Sandbox Code Playgroud)
对于所有对象a
和b
在哪里!a.equals(b)
.进一步来说:
a.equals(b) ? b.equals(a) && a.compareTo(b) == 0 &&
b.compareTo(a) == 0 && a.hashCode() == b.hashCode()
: !b.equals(a) && a.compareTo(b) != 0 &&
a.compareTo(b) == -b.compareTo(a)
Run Code Online (Sandbox Code Playgroud)
必须评估以true
满足相关合同.
因此null
你不能这样做是不允许的:
null.compareTo(a)
Run Code Online (Sandbox Code Playgroud)
Comparator
更灵活,因此处理null
是特定于实现的问题.是否支持取决于您的要求Comparator
.
甚至不得不对包含null元素的List进行排序,或者这是设计错误的确定标志是一个好主意吗?
从概念上讲,null意味着"没有",并且在列表中放置任何内容对我来说都很奇怪.此外,Java List合同声明了这一点
某些列表实现对它们可能包含的元素有限制.例如,某些实现禁止null元素
因此,甚至不需要Java中的List实现来支持null元素.总而言之,如果您没有充分的理由将null放入列表中,请不要,如果您这样做,请测试它实际上是否按预期工作.
归档时间: |
|
查看次数: |
16470 次 |
最近记录: |