Java:在equals检查中避免NullPointerException的干净方法

Svi*_*ish 20 java coding-style equals nullpointerexception

我有一个地址对象,我想为其创建一个equals方法.我可以通过做类似下面的事情(缩短一点)使这变得非常简单:

public boolean equals(Object obj) 
{
    if (this == obj)
        return true;

    if (obj == null)
        return false;

    if (getClass() != obj.getClass())
        return false;

    Address other = (Address) obj;

    return this.getStreet().equals(other.getStreet())
        && this.getStreetNumber().equals(other.getStreetNumber())
        && this.getStreetLetter().equals(other.getStreetLetter())
        && this.getTown().equals(other.getTown());
}
Run Code Online (Sandbox Code Playgroud)

问题是,其中一些可能是空的.换句话说,NullPointerException如果此地址中没有街道信件,我会得到一个.

如何在考虑空值的情况下以干净的方式编写此文件?

Pet*_*rey 15

您可以使用辅助方法

public static boolean isEqual(Object o1, Object o2) {
    return o1 == o2 || (o1 != null && o1.equals(o2));
}
Run Code Online (Sandbox Code Playgroud)

  • 从 1.7 开始,该方法在 java.util.Objects 中可用。您可以直接使用它。Objects.equals(o1, o2)。 (2认同)

bdo*_*han 8

您可以执行以下操作:

public boolean equals(Object obj) 
{
    if (this == obj) {
        return true;
    }

    if (obj == null) {
        return false;
    }

    if (getClass() != obj.getClass()) {
        return false;
    }

    Address other = (Address) obj;

    return equals(this.getStreet(),other.getStreet())
        && equals(this.getStreetNumber(), other.getStreetNumber())
        && equals(this.getStreetLetter(), other.getStreetLetter())
        && equals(this.getTown(), other.getTown());
}

private boolean equals(Object control, Object test) {
    if(null == control) {
        return null == test;
    }
    return control.equals(test);
}
Run Code Online (Sandbox Code Playgroud)

Java 7引入了对java.util.Objects类的用例的内置支持,请参阅:

  • @Blaise:-1 对于你的问题,因为没有将 if 语句的主体括在括号中。我的意思是,拜托,这是 2011 年,而不是 1960 年代。省略括号是一种可怕的做法,几十年来我们都知道这种做法会增加缺陷的发生率。 (2认同)
  • @Jigar:如果我可以 -neg 代表你的评论,我会的。为什么它是最佳的?两种形式都被编译为完全相同的字节码。这两组 if(和 if-else)语句在语法上是等效的(提示,您需要了解编译器的工作原理)。此外,引入假设的基于集合的场景并不能验证您的论点,因为它不适用于正在考虑的特定代码片段 - 这是糟糕的工程思维。 (2认同)

Jar*_*ell 8

Google Guava提供了Objects.equal(Object,Object),它检查相等性,同时考虑到其中任何一个参数可能为null:

...
return Objects.equal(this.getStreet(), other.getStreet())
    && Objects.equal(this.getStreetNumber(), other.getStreetNumber())
    && Objects.equal(this.getStreetLetter(), other.getStreetLetter())
    && Objects.equal(this.getTown(), other.getTown());
Run Code Online (Sandbox Code Playgroud)

值得指出的是,Objects还有其他辅助方法来实现 hashCode()toString().