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

JavaFX: How do I override the hashCode method for a bean with properties?

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

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

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());
    }
}

那么2种写法中哪一种才是正确的写法呢hashCode()?还是正确的方法完全不同?

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

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

简化。

属性不会覆盖 hashCodeequals。您可以通过转到他们的文档页面(例如 StringProperty)并向下滚动到显示 "Methods inherited from class java.lang.Object" 的位置来验证这一点。如果列出 hashCodeequals,则不会覆盖它们。

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

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

相同