Objects.compare()方法的目的是什么?

时间:2015-09-22 16:33:44

标签: java java-7

Java 7引入了Objects类,其中包含“null - 安全或null - 容忍”方法,包括compare(T, T, Comparator<T>)。但我什么时候会使用

Objects.compare(left, right, comparator);

简单地调用

comparator.compare(left, right);

Objects.comparenull - 如果comparator也是安全的,那么我为什么要包装比较调用呢?首先检查对象标识的优化似乎应该在比较器本身中完成。如果comparator.compare(left, right)NullPointerExceptioncomparator全部为left,我可以看到的唯一真正的行为差异就是right会引发null ,而Objects.compare没有;对于新的标准库方法而言,这似乎并不是一个重要的考虑因素。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:14)

这很有意思。 {Dar}的Objects引入了.compare()类以及Objects方法,提交消息引用3b45b809d8ff并指示&#34; Sherman&#34; (沉雪明?)签了字。除了该错误之外,还有Bug 6797535从2009年9月开始讨论要添加到compare(int, int)的功能。在线程中讨论添加Objects.compare()(和类似的)原始比较方法,并最终决定它们应该驻留在它们各自的包装类中(参见this thread)。这个方法是Integer.compare()引入的,但没有我能找到的任何评论。

以后later in that thread包含compare()a patch is sent out for review

  

我认为你不应该添加这种方法(比较(T a,T b,Comparator c))。它的实用性尚不清楚,它没有   本课程中其他方法的功率重量比。

Joshua Bloch replies

  

是的,我把它包含在&#34;第12项:考虑实施可比较的&#34;   来自EJv2。

我不清楚这种方法对Darcy responds提出的问题,但问题似乎没有再次提出。我推断,出于风格原因,我的目的是提供一种等同于原始ClassNotFoundException的方法,但我还没有找到证据,这实际上就是原因。

值得注意的是,在达西和布洛赫之间的同一次交流中,Item 12方法同样受到布洛赫的批评:

  

我肯定/不会/添加此方法(Objects.toString)。它没有带来任何已经存在的表格。人们知道并使用String.valueOf。通过增加另一种选择,让我们不要混淆水域。

但是我们知道它没有被删除,达西只是回答:

  

如此指出。

总而言之,在我看来,这是在没有太多意图的情况下引入的。它被提出并且所提出的异议并没有阻止它被检入。我想像一个更严格的设计审查会在离开它时犯错误,就像Bloch建议的那样。

您可能也对这个类似的问题感兴趣(虽然它是关于实施细节,而不是API更改):Objects.toString()