有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache Commons Lang3哈希代码,Equals和ToString,包括枚举

我们在模型中为服务响应和请求对象定义了很少的数据类型。最近,我们发现需要在所有这些类型上实现ToString、HashCode和Equals,以利用这些过度比较和断言。从What issues should be considered when overriding equals and hashCode in Java?Right way to implement equals contract等少数源代码确认,我们随后使用org.apache.commons.lang3.builder.EqualsBuilderHashCodeBuilderToStringBuilder实现了toString、equals和hashcode,如下所示-


响应。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
}

在使用默认库版本实现这些时,我们想到了一个thought around enums-

当数据类型可能也包含包括枚举的参数时,使用库中的默认hashcode和equals是否正确? 是否有一个库(在commons中)支持实现正确的优化解决方案来覆盖hashcode和equals的实现

另一方面,库的实现是否需要改进,或者它是否正确到了现有的程度


编辑:也在类中的Object字段(edited)上添加了实现。如果我重写hashCode并将它们的实现等同于hashCode,那么问题是相同的

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

编辑2:我还可以看到对JIRA上枚举值的HashCode实现不一致的问题


共 (0) 个答案