我们在模型中为我们的服务响应和请求对象定义了很少的数据类型。最近我们发现需要在所有此类类型上实现ToString、HashCode 和 Equals,以利用这些过度比较和断言。从少数来源确认,如在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?,实现equals合约等的正确方法我们遵循使用toString,equals和 hashcode实现org.apache.commons.lang3.builder.EqualsBuilder
,如下 -HashCodeBuilder
ToStringBuilder
响应.java
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
public class Response {
private Integer value;
private Currency currency;
private Object edited;
public Response() {
}
public Response(Integer value, Currency currency, Object edited) {
this.value = value;
this.currency = currency;
this.edited = edited;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
public Object getEdited() {
return edited;
}
public void setEdited(Object edited) {
this.edited = edited;
}
@Override public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Response Response = (Response) o;
return new EqualsBuilder().append(value, Response.value).append(currency, Response.currency)
.append(edited, Response.edited).isEquals();
}
@Override public int hashCode() {
return new HashCodeBuilder(17, 37).append(value).append(currency).append(edited).toHashCode();
}
@Override public String toString() {
return "Response{" + "value=" + value + ", currency=" + currency + ", edited=" + edited + '}';
}
}
货币.java
public enum Currency {
INR
}
在使用默认库版本实现这些时,我们想到了一个关于枚举的想法 -
当数据类型可能包含参数(包括枚举)时,使用库中的默认哈希码和等于是否正确?是否有一个库(在公共范围内会很棒)支持实现正确的优化解决方案来覆盖哈希码和等于的实现?
附带说明一下,这里的库实现是否需要改进,或者它对现有的内容是否正确?
编辑Object
:在类中的字段(edited
)上也添加了实现如果我覆盖这些 hashCode 和 equals 实现,则存在同样的问题。
我最终是否使用了一个对象的哈希码,它对于不同的实例是不同的,因为它主要是内存映射地址?
编辑 2 :我还可以看到对JIRA上 Enum 值的 HashCode 实现不一致的担忧