Nam*_*man 6 java enums equals hashcode apache-commons-lang3
我们为服务响应和模型中的请求对象定义了很少的数据类型.最近我们发现需要在所有这些类型上实现ToString,HashCode和Equals,以便在比较和断言上使用它们.从少数几个来源确认在Java中覆盖equals和hashCode时应该考虑哪些问题?,实行正确的做法等于合同 等我们跟着执行的toString,equals和hashCode使用org.apache.commons.lang3.builder.EqualsBuilder,HashCodeBuilder并ToStringBuilder如下-
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 + '}';
}
}
Run Code Online (Sandbox Code Playgroud)
Currency.java
public enum Currency {
INR
}
Run Code Online (Sandbox Code Playgroud)
在使用默认库版本实现这些时,我们会想到一些关于枚举的想法 -
当数据类型可能包含枚举参数时,使用默认的哈希码和库中的equals是否正确?是否有一个库(在公共区域内会很棒)支持实现正确优化的解决方案来覆盖hashcode和equals的实现?
从侧面说明,库实现需要在这里进行改进还是对存在的内容是否正确?
编辑:已经在类中的Object字段(edited)上添加了实现.如果我覆盖hashCode并且等于这些的实现,则存在相同的问题.
我最终是否使用了Object的hashcode,这对于不同的实例是不同的,因为它主要是内存映射地址?
编辑2:我还可以看到对 JIRA上的Enum值的HashCode上的不一致实现提出了一个问题
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |