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
才不是;这似乎并不是一个重要的考虑因素,可以保证新的标准库方法。
我错过了一些明显的东西吗?
这很有意思。该 Objects
上课,还有这个 .compare()
方法,介绍 3b45b809d8ff 由Joe Darcy撰写,提交消息引用 错误6797535 并表示“谢尔曼”(沉雪明?)签了字。除了虫子之外 这个帖子 从2009年9月开始讨论要添加的功能 Objects
。在线程人员讨论添加 compare(int, int)
(和类似的)原始比较方法,并最终决定这些应该驻留在它们各自的包装类中(参见 Integer.compare()
)。介绍了这种方法 后来在那个帖子里 但没有任何我能找到的评论。
后来 发送补丁以供审核 含 Objects.compare()
,和 约书亚布洛赫回答:
我认为你不应该添加这种方法(比较(T a,T b,比较器c))。它的实用性尚不清楚,它没有
本课程中其他方法的功率重量比。
达西回应:
是的,我把它包含在“第12项:考虑实施可比较”中
来自EJv2。
我不清楚这种方法带来了什么 项目12,但问题似乎没有再次提出。我推断,目的是提供一个等同于原语的方法 compare()
这是出于文体方面的原因,但我没有找到证据确实是其中的原因。
值得注意的是,在Darcy和Bloch之间的同一次交流中 Objects.toString()
方法同样受到布洛赫的批评:
我绝对/不会/添加此方法(Objects.toString)。它没有带来任何尚未存在的表格。人们知道并使用String.valueOf。通过增加另一种选择,让我们不要混淆水域。
但正如我们所知,它没有被删除,达西只是回应:
如此指出。
总而言之,在我看来,这是在没有太多意图的情况下引入的。它被提出并且所提出的反对意见并没有阻止它被检查。我想像一个更严格的设计审查会错误地将其遗漏,就像布洛赫所说的那样。
您可能也对这个类似的问题感兴趣(虽然它是关于实现细节,而不是API更改): 为什么Arrays.fill()不再用在HashMap.clear()中了?