Apache Commons ObjectUtils等于方法测试的等级是什么?

Cao*_*lte 17 java equality equals apache-commons apache-commons-lang

我一直都知道Java中有两种类型的相等,

  • value equality:使用该.equals()方法测试两个对象是否在非null对象引用上实现等价关系.
  • 引用相等:使用==运算符来测试两个基本类型或内存位置是否相等.

以下几页更详细地描述了这些语言基础知识.

这两个链接没有明确指定的是,如果比较两个null对象引用的值相等,应该会发生什么.隐含的假设是NullPointerException应该抛出a,但这不是ObjectUtils.equals()方法所做的,这可能被认为是最佳实践效用方法.

令我担心的是,Apache Commons似乎已经在后门有效地引入了第三种平等的Java,并且已经令人困惑的事态可能会变得更加复杂.我称之为平等的第三个衡量标准,因为它试图测试值的相等性,当它失败时,它又回到测试参考相等性.Apache Commons相等测试与值相等和引用相等有许多相似之处,但也有明显的不同.

我是否有权利关注并希望避免使用ObjectUtils.equals()尽可能的地方?

有没有争论要求ObjectUtils.equals()提供其他两种平等衡量标准的有用联合?

选择答案

似乎没有就这个问题达成共识意见,但我决定将Bozho标记为正确,因为他最好将我的注意力吸引到我现在认为是无效安全等于检查的最大问题.我们都应该编写快速失败的代码,解决为什么要比较两个空对象的价值平等的根本原因而不是试图在地毯下扫描问题.

Boz*_*zho 10

这是代码ObjectUtils.equals(..):

public static boolean equals(Object object1, Object object2) {
     if (object1 == object2) {
       return true;
     }
     if ((object1 == null) || (object2 == null)) {
       return false;
    }
    return object1.equals(object2);
}
Run Code Online (Sandbox Code Playgroud)

ObjecUtils文档明确指出传递的对象可以为null.

现在关于这个问题,true如果你比较两个,是否应该返回null.在我看来 - 不,因为:

  • 当你比较两个对象时,你可能会在以后对它们做些什么.这将导致一个NullPointerException
  • 传递两个nulls进行比较意味着他们从某个地方而不是"真实"物体,可能是由于某些问题.在这种情况下,单独比较它们是错误的 - 程序流程应该在此之前停止.
  • 在我们在这里使用的自定义库中,我们有一个名为equalOrBothNull()- 的equals方法,它与null实现中的方法不同.


Mic*_*rdt 5

我是否有权关注并希望尽可能避免使用ObjectUtils.equals()?

不.您需要考虑的等于您的要求.并且想要考虑两个空值相等且任何非null不等于null而不必处理NullPointerExceptions是一个非常非常常见的要求(例如,当您想要从setter触发值更改事件时).

实际上,它equals()通常应该如何工作,并且通常,实现了一半的behvaiour(状态的API文档Object.equals()"对于任何非空的引用值x,x.equals(null)应该返回false.") - 它不起作用反过来主要是由于技术限制(语言设计没有多次发送更简单).