JavaFX:如何覆盖具有属性的bean的hashCode方法?

问题描述 投票:0回答:2

众所周知,当equals()被覆盖时,hashCode()也必须被覆盖。

这是非JavaFX bean类中的典型示例。

public class Person {
    private String name;
    private int age;

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
       if (!(obj instanceof Person))
            return false;
        if (obj == this)
            return true;

        Person rhs = (Person) obj;

        return Objects.equals(name, rhs.name) &&
               age == rhs.age;
    }
}

JavaFX bean:

public class Person {
    private StringProperty name;
    private IntegerProperty age;

    // Option A
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age.hashCode();
        return result;
    }

    // Option B
    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.get().hashCode();
        result = 31 * result + age.get().hashCode();
        return result;
    }

    @Override
    public boolean equals(Object obj) {
       if (!(obj instanceof Person))
            return false;
        if (obj == this)
            return true;

        Person rhs = (Person) obj;

        return Objects.equals(name.get(), rhs.name.get()) &&
               Objects.equals(age.get(), rhs.age.get());
    }
}

那么两种方法中的哪一种是写hashCode()的正确方法?或者正确的方法是完全不同的?

java javafx equals hashcode
2个回答
1
投票

属性不会覆盖hashCodeequals。您可以通过转到他们的文档页面(例如StringProperty)并向下滚动到“从类java.lang.Object继承的方法”的位置来验证这一点。如果列出hashCodeequals,那么它们不会被覆盖。

因此,例如,name.get().hashCode()是正确的。 name.hashCode()将返回Object定义的身份哈希码。

equals也是如此。例如,name.equals(rhs.name)将从Object调用基本实现,这与name == rhs.name相同。


0
投票

方法hashCode()是帮助计算机知道两个对象快速不相等,你上面写的两个方法是可以的。如果你使用java 1.7+,你可以使用

Objects.hash(filed1,filed2,filed3,.....)

简化。

© www.soinside.com 2019 - 2024. All rights reserved.