草庐IT

java - Apache Commons ObjectUtils equals 方法测试什么样的相等性?

coder 2023-08-28 原文

我一直理解 Java 中有两种类型的相等性,

  • 值相等:使用.equals() 方法来测试两个对象是否在非空对象引用上实现了等价关系。
  • 引用相等:使用 == 运算符来测试两个原始类型或内存位置是否相等。

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

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

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

我担心并希望尽可能避免使用 ObjectUtils.equals() 是否正确?

是否有理由声称 ObjectUtils.equals() 提供了其他两种平等措施的有用联合?

选择的答案

关于这个问题似乎没有达成共识,但我决定将 Bozho 的意见标记为正确的,因为他最好地提醒我注意我现在认为空安全等于检查的最大问题。我们都应该编写快速失败代码来解决为什么要比较两个空对象的值相等性的根本原因,而不是试图掩盖问题。

最佳答案

这是 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);
}

ObjecUtils docs明确声明传递的对象可以为空。

现在讨论如果比较两个 null 是否应该返回 true 的问题。在我看来 - 不,因为:

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

关于java - Apache Commons ObjectUtils equals 方法测试什么样的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133329/

有关java - Apache Commons ObjectUtils equals 方法测试什么样的相等性?的更多相关文章

随机推荐