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


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 如果所有的 comparatorleft 和 right 是 null,而 Objects.compare 才不是;这似乎并不是一个重要的考虑因素,可以保证新的标准库方法。

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


4282
2017-09-22 16:33


起源

我同意,这种方法绝对是愚蠢的。 番石榴的 Ordering 在解决这个问题方面做得更好。 - Sean Patrick Floyd
JDK中的任何地方都没有使用该方法:)可能没用。 - ZhongYu
这个方法唯一能做的就是检查两个参数是否都为null,以防你的比较器没有测试那种情况。像大多数班级一样没用 - njzk2
@ njzk2我不认为“那个阶级的其余部分”是“无用的”。我发现 Objects.hash 特别有用,以及 Objects.requireNonNull 在它的变体与消息。 - user4235730


答案:


这很有意思。该 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()中了?


14
2017-11-04 21:49



赏金传入。感谢您的研究和精湛的答案。我们可以从历史中学到很多东西:主要是对API设计的深入了解,以及对Oracle流程的深入了解。 Josh Bloch神似的级别证实了。令人遗憾的是,这个家伙已经不再公开可见了。 - Petr Janeček
我很高兴:)我总是喜欢深入研究为什么做出这样的决定。 - dimo414