关于空值的可比合同和比较合同

2023-12-21

Comparable合同规定e.compareTo(null)必须扔NullPointerException.

From the API http://java.sun.com/javase/6/docs/api/java/lang/Comparable.html:

注意null不是任何类的实例,并且e.compareTo(null)应该抛出一个NullPointerException虽然e.equals(null)回报false.

另一方面,Comparator API http://java.sun.com/javase/6/docs/api/java/util/Comparator.html没有提到比较时需要发生什么null。考虑以下通用方法的尝试,该方法采用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元素,或者这是设计错误的明确标志?

Comparable不允许null仅仅是因为:

a.compareTo(b) == -b.compareTo(a)

对于所有对象a and b where !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)

必须评估为true以满足相关合同的要求。

So null不允许,因为你不能这样做:

null.compareTo(a)

Comparator更加灵活,因此处理null是一个特定于实现的问题。支持不支持就看你想要什么了Comparator to do.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于空值的可比合同和比较合同 的相关文章

随机推荐