我一直理解Java中有两种类型的相等,
- 值相等:使用该
.equals()
方法测试两个对象在非空对象引用上实现等价关系。 - 引用相等:使用
==
运算符来测试两个原始类型或内存位置是否相等。
以下页面更详细地描述了这些语言基础知识。
- Wikibooks Java 编程:Java 编程/比较对象
- xyzws Java EE 常见问题解答:相等运算符和 equals 方法有什么区别?
- Java 平台 API:Object.equals() 的 Javadoc
- Java 语言规范:等式运算符
这些链接都没有明确指定如果null
比较两个对象引用的值相等应该发生什么。隐含的假设是应该抛出 a ,但这不是ObjectUtils.equals()NullPointerException
方法所做的,它可能被认为是最佳实践实用方法。
让我担心的是,Apache Commons似乎已经通过后门有效地将第三种平等措施引入了 Java,而本已令人困惑的情况可能会变得更加复杂。我称它为第三种相等性度量,因为它尝试测试值相等性,当失败时,它会退回到测试引用相等性。Apache Commons 相等测试与值相等和引用相等有许多相似之处,但也有明显不同。
我是否应该担心并希望尽可能避免使用ObjectUtils.equals()
?
是否有理由声称ObjectUtils.equals()
提供了其他两种平等措施的有用结合?
选择的答案
在这个问题上似乎没有达成共识,但我决定将 Bozho 标记为正确,因为他最能引起我的注意,我现在认为这是 null-safe equals 检查的最大问题。我们都应该编写快速失败的代码来解决为什么要比较两个空对象的值相等的根本原因,而不是试图将问题扫到地毯下。