Java:避免在等值检查中避免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());
}
问题是,其中一些可能为空。换句话说,如果这个地址没有街道字母,我将得到一个“ 1”。 如何在考虑空值的同时以简洁的方式编写此代码?     
已邀请:
您可以使用类似
public static boolean isEqual(Object o1, Object o2) {
    return o1 == o2 || (o1 != null && o1.equals(o2));
}
    
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());
还值得指出的是,对象还有其他用于实现hashCode()和toString()的帮助器方法。     
您可以执行以下操作:
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);
}
Java 7通过java.util.Objects类引入了对此用例的内置支持,请参见: java.utils.Objects.equals(Object,Object) java.utils.Objects.deepEquals(Object,Object)     
我有一个带有静态方法的帮助程序类Checker:
 public static boolean isEquals(final Object o1, final Object o2) {
        return o1 == null ? o2 == null : o1.equals(o2);
 }
因此,在equals方法中
 return Checker.isEquals(this.getStreet(), other.getStreet())
        && Checker.isEquals(this.getStreetNumber(), other.getStreetNumber())
        && Checker.isEquals(this.getStreetLetter(), other.getStreetLetter())
        && Checker.isEquals(this.getTown(), other.getTown());
    
没有真正干净的方法可以做到这一点。最好的选择可能是让您的IDE为您生成代码。 Eclipse可以通过Source-> Generate hashCode()和equals()上下文菜单来实现。     
您可以使用来自Google番石榴的Objects.equal或来自Apache Commons的EqualsBuilder     
我考虑将某些equals方法定义为静态类方法,例如对Street对象说。这样,您永远不会尝试在null上调用.equals()方法。 示例函数可能类似于:
public static boolean equals(Object one, Object two)
另外,将支票放在
if (obj == null)
   return false;
在功能的最开始     
Apache Commons Lang为平等比较提供了EqualsBuilder帮助器类。还有一个用于哈希码。
return new EqualsBuilder()
.append(this.getStreet(), other.getStreet())
.append(this.getStreetNumber(), other.getStreetNumber()
.append(this.getStreetLetter(), other.getStreetLetter())
.append(this.getTown(), other.getTown())).isEquals();
    

要回复问题请先登录注册