Apache Commons Lang3 Hashcode、Equals 和 ToString(包括枚举)

2023-12-28

我们在模型中为服务响应和请求对象定义了很少的数据类型。最近我们发现需要实施ToString、HashCode 和等于在所有此类类型上利用这些过度比较和断言。从几个来源确认,例如在Java中重写equals和hashCode时应该考虑哪些问题? https://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java/27609#27609, 等等,我们随后使用以下方法实现了 toString、equals 和 hashcodeorg.apache.commons.lang3.builder.EqualsBuilder, HashCodeBuilder and 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
}

在使用默认库版本实现这些时,有一个围绕枚举进行思考 https://stackoverflow.com/questions/4885095/what-is-the-reason-behind-enum-hashcode我们想到的是——

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

顺便说一句,库的实现是否需要改进,或者它对现有的是否正确?


Edit:已添加实施Object field(edited)在课堂上也是如此。如果我重写这些的 hashCode 和 equals 实现,那么问题也是一样的。

我最终是否会使用对象的哈希码,该哈希码对于不同的实例是不同的,因为它主要是内存映射地址?

Edit 2:我还可以看到对 HashCode 上 Enum 值的实现不一致的担忧JIRA https://issues.apache.org/jira/browse/LANG-780


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache Commons Lang3 Hashcode、Equals 和 ToString(包括枚举) 的相关文章

随机推荐