Apache Commons Lang3 Hashcode,Equals和ToString包括Enums

我们为服务响应和模型中的请求对象定义了很少的数据类型。 最近我们发现需要在所有这些类型上实现ToString,HashCode和Equals ,以便在比较和断言上使用它们。 从少数几个来源确认在Java中覆盖equals和hashCode时应该考虑哪些问题? , 正确的方法来实现等于合同等我们遵循使用org.apache.commons.lang3.builder.EqualsBuilderHashCodeBuilderToStringBuilder实现toString,equals和hashcode,如下所示 –


Response.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 + '}'; } } 

Currency.java

 public enum Currency { INR } 

在使用默认库版本实现这些时,我们会想到一些关于枚举的想法 –

当数据类型可能包含枚举参数时,使用默认的哈希码和库中的equals是否正确? 是否有一个库(在公共区域内会很棒)支持实现正确优化的解决方案来覆盖hashcode和equals的实现?

在旁注中,库实现需要在这里进行改进,还是对存在的内容是否正确?


编辑 :已在类中的Object字段(已edited )上添加了实现。 如果我覆盖hashCode并且等于这些的实现,则存在相同的问题。

我最终是否使用了Object的hashcode,这对于不同的实例是不同的,因为它主要是内存映射地址?

编辑2 :我还可以看到对JIRA上的Enum值的HashCode上的不一致实现提出了一个问题