java哈希代码应该依赖于最终的变量

xoshrz7s  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(295)
public lass A {
    private String id;
    private String attr1;
    private String attr2;

    @Override
    public boolean equals(Object obj)    {
        if (!(obj instanceof A)) 
            return false;

        A a = (A) obj;

        return new EqualsBuilder()
                .append(id, a.id)
                .append(attr1, a.attr1
                .append(attr2, a.attr2)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder()
                .append(id)
                .hashCode();
    }
}

在示例类中,id应该是hashcode()正常工作的最终值。
否则,在属性修改导致内存泄漏之后,objet将从集合中消失。

A a = new A();
a.setId("id1");
a.setAttr1("attr1");
a.setAttr2("attr2");

Set set = new HashSet();
set.add(a);

set.contains(a) == true;

a.setId("id2");

set.contains(a) == false;

我遗漏了什么吗?为什么没有在hashcodebuilderjavadoc中声明?
这让我陷入困境,因为我见过太多hashcode和equals在同一组字段上中继的情况。似乎没人想到。。。

@Override
    public boolean equals(Object obj)    {
        if (!(obj instanceof A)) 
            return false;

        A a = (A) obj;

        return new EqualsBuilder()
                .append(id, a.id)
                .append(attr1, a.attr1
                .append(attr2, a.attr2)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder()
                .append(id)
                .append(attr1)
                .append(attr2)
                .hashCode();
    }
zengzsys

zengzsys1#

它记录在object.hashcode javadocs中:
在java应用程序执行期间,每当在同一对象上多次调用hashcode方法时,只要不修改对象的equals比较中使用的信息,hashcode方法就必须始终返回相同的整数。从一个应用程序的一个执行到同一应用程序的另一个执行,这个整数不需要保持一致。
作为final的字段将满足这一点。如果这是不可能的,那么你仍然可以使用它们 hashCode 只要你以后不改变它们的值。

相关问题