如何防止等于之前的空检查

时间:2011-10-25 13:23:18

标签: java equals code-cleanup

我在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中是否存在类似的东西,或者如果是这样的话,首选的方法是什么?

9 个答案:

答案 0 :(得分:38)

Java 7提供java.util.Objects.equals

答案 1 :(得分:23)

使用commons-lang:

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

来自Apache

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

这与您在C#中所做的相同。

答案 2 :(得分:6)

Guava equal这样做:

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

null object pattern

Guava也有一些相关的comparison chain和一些其他goodies

答案 3 :(得分:4)

我会这样写:

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

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

答案 4 :(得分:2)

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

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

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

我看到了双方:

在一边充满了空检查的代码,不再信任单个参数的方法和不想忘记空检查的开发人员。

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

答案 5 :(得分:1)

作为Project Coin的一部分,有一项建议是向Java添加一系列null-safe operators。可悲的是,他们没有把它变成Java 7,也许它们会出现在Java 8中。Here是关于它们如何工作的一般概念

答案 6 :(得分:1)

实际上每个人都有自己的方式来做这件事,我也想在这里介绍groovy。

有一种方法

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

在groovy中,对象有null安全操作符。让我们为类

举个例子
A { 
 String name = "test1"
String surName = "test2"

public String returnName() {

 return name + surName
}

}

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

注意:我没有在代码中应用半冒号,因为在groovy中不需要。

答案 7 :(得分:0)

如果为您的类实现了toString,

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

答案 8 :(得分:0)

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

所以null意味着它没有在堆中给出的任何内存位置。因此可以使用'=='运算符进行简单检查。