问题描述
||
我有一个地址对象,我想为其创建一个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();