Cao*_*lte 17 java equality equals apache-commons apache-commons-lang
我一直都知道Java中有两种类型的相等,
.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.在我看来 - 不,因为:
NullPointerExceptionnulls进行比较意味着他们从某个地方而不是"真实"物体,可能是由于某些问题.在这种情况下,单独比较它们是错误的 - 程序流程应该在此之前停止.equalOrBothNull()- 的equals方法,它与null实现中的方法不同.