Java 7引入了Objects
类,其中包含“null
- 安全或null
- 容忍”方法,包括compare(T, T, Comparator<T>)
。但我什么时候会使用
Objects.compare(left, right, comparator);
简单地调用
comparator.compare(left, right);
Objects.compare
仅null
- 如果comparator
也是安全的,那么我为什么要包装比较调用呢?首先检查对象标识的优化似乎应该在比较器本身中完成。如果comparator.compare(left, right)
,NullPointerException
和comparator
全部为left
,我可以看到的唯一真正的行为差异就是right
会引发null
,而Objects.compare
没有;对于新的标准库方法而言,这似乎并不是一个重要的考虑因素。
我错过了一些明显的东西吗?
答案 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))。它的实用性尚不清楚,它没有 本课程中其他方法的功率重量比。
是的,我把它包含在&#34;第12项:考虑实施可比较的&#34; 来自EJv2。
我不清楚这种方法对Darcy responds提出的问题,但问题似乎没有再次提出。我推断,出于风格原因,我的目的是提供一种等同于原始ClassNotFoundException
的方法,但我还没有找到证据,这实际上就是原因。
值得注意的是,在达西和布洛赫之间的同一次交流中,Item 12方法同样受到布洛赫的批评:
我肯定/不会/添加此方法(Objects.toString)。它没有带来任何已经存在的表格。人们知道并使用String.valueOf。通过增加另一种选择,让我们不要混淆水域。
但是我们知道它没有被删除,达西只是回答:
如此指出。
总而言之,在我看来,这是在没有太多意图的情况下引入的。它被提出并且所提出的异议并没有阻止它被检入。我想像一个更严格的设计审查会在离开它时犯错误,就像Bloch建议的那样。
您可能也对这个类似的问题感兴趣(虽然它是关于实施细节,而不是API更改):Objects.toString()