我需要为equals() and hashCode()
课程实施Address
。
我相信,非空字段用于确定hashCode()和equals()。在我的应用程序中,除addressLine1
和country
之外的任何字段都可以为null。如果是如果两个不同的地址具有相同的addressline1和country,会发生什么?
Address1:(in state of NH which is omitted by user)
addressline1:111,maple avenue
country: US
Address2:
addressline1:111,maple avenue
state: Illinois
country: US
在这种情况下,如果我只基于非空字段构建一个hashCode,它将为上述两个地址提供相同的内容。
这是创建hashCode的正确方法吗?
int hash = addressline.hashCode();
if(addressLine2!=null){
hash += addressLine2.hashCode();
}
and so on...
答案 0 :(得分:2)
通常,您会检查一个是否为null而另一个不在您的equals方法中。对于哈希码,您只需使用0作为空哈希码。例如:
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((addressLine1 == null) ? 0 : addressLine1.hashCode());
result = prime * result + ((state == null) ? 0 : state.hashCode());
result = prime * result + ((country == null) ? 0 : country.hashCode());
return result;
}
如果您使用IDE,它通常会为您生成这些。在eclipse中,选择Source,Generate equals和hashcode,它将允许您选择要作为equals和hashcode方法一部分的字段。对于equals方法和您的字段,这就是eclipse创建的内容:
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
YourClass other = (YourClass) obj;
if (addressLine1 == null) {
if (other.addressLine1 != null) return false;
} else if (!addressLine1.equals(other.addressLine1)) return false;
if (country == null) {
if (other.country != null) return false;
} else if (!country.equals(other.country)) return false;
if (state == null) {
if (other.state != null) return false;
} else if (!state.equals(other.state)) return false;
return true;
}
我会以此作为起点,并从那里做出你认为必要的任何改变。
答案 1 :(得分:1)
即使是null的字段也应该进行相等性比较。使用如下代码 比较两个非原始类型的字段,如String:
this.addressline==null ? other.addressline==null : this.addressline.equals(other.addressline)
对于哈希码,请使用您在equals中使用的相同字段,但可以将空值视为 哈希码为0(或任何其他哈希码值)。
以下是规范问题:
What issues should be considered when overriding equals and hashCode in Java?
以下是有助于您正确实施这些方法的库的讨论: