21

我发现这样的东西在equals方法中相当烦人和丑陋:

if (field == null)
{
    if (other.field != null)
        return false;
}
else if ( ! field.equals(other.field))
    return false;

在 C# 中,我可以这样做:

if( ! Object.Equals(field, other.field))
    return false;

Java中是否有类似的东西,或者如果做这种事情的首选方法是什么?

4

9 回答 9

47

Java 7 提供java.util.Objects.equals

于 2011-10-25T14:55:50.473 回答
25

使用公共语言:

org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)

源代码:

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

来自阿帕奇

http://commons.apache.org/lang/

这大约相当于你在 C# 中所做的

于 2011-10-25T13:27:11.030 回答
5

Guava equal这样做:

public static boolean equal(@Nullable Object a, @Nullable Object b) {
    return a == b || (a != null && a.equals(b));
  }

空对象模式

Guava 也有一些相关的比较链和大量其他好东西

于 2011-10-25T13:29:36.480 回答
4

我会这样写:

return field != null && other.field != null && field.equals(other.field);

这不像 C# 代码行那么优雅,但比您发布的 if 树短得多。

于 2011-10-25T13:27:33.883 回答
2

我从技术上接受所有答案。实际上,我不会在我控制的代码中使用它们中的任何一个,因为所有提供的解决方案都在解决核心问题:空值。保持你的核心模型没有空值,在这种情况下这个问题已经过时了。

在像第三方库这样的系统边界处,有时必须处理空值。它们应该转换为对核心模型有意义的值。那里给出的解决方案很有帮助。

即使 Oracle 推荐 equals-Methods 是 null 安全的,请考虑一下:一旦您接受 null 值,您的模型就会变得脆弱。equals 方法不会是您检查 null 的最后一种方法。您必须在方法调用层次结构中管理空检查。方法可能不再开箱即用。很快,将检查每个参数是否为空。

我看到了双方:

一方面代码充满了空检查,不再信任单个参数的方法以及害怕忘记空检查的开发人员。

另一方面,具有完整表达语句的代码可以明确断言具有可以使用的完整功能对象,而不必担心 NullPointerExceptions。

于 2015-07-23T19:33:38.430 回答
1

作为 Project Coin 的一部分,有人提议在 Java中添加一系列空安全运算符。遗憾的是,它们没有进入 Java 7,也许它们会出现在 Java 8 中。以下是它们如何工作的总体思路

于 2011-10-25T13:32:42.997 回答
1

实际上每个人都遵循自己的方式来做到这一点,我也想在这里介绍 groovy。

有一种方法

field == null ? false : true;// 所以基本上当它不为null时它会返回true。

在 groovy 中,对象有空安全运算符。让我们以课堂为例

A { 
 String name = "test1"
String surName = "test2"

public String returnName() {

 return name + surName
}

}

A a = null a?.name // 提到的操作符?实际上会检查 a 是否null存在。然后它将调用名称。

注意:我没有在代码中应用分号,因为这在 groovy 中是不需要的。

于 2015-08-06T06:39:45.450 回答
0

如果为您的类实现了 toString,则 String.valueOf() 将解决其中的一些问题。如果指针为空,它将吐出 toString() 答案或“null”。

于 2011-10-25T13:26:20.040 回答
0

在检查对象引用时使用 == 运算符,如果两个引用都引用同一个对象,它将返回 true。否则,如果您正在寻找对象内容,请使用对象的 .equals 方法。

所以 null 意味着它没有在堆中给出任何内存位置。所以可以简单地用'=='操作符检查。

于 2015-07-23T19:43:50.680 回答