gpt4 book ai didi

JavaFX:如何重写具有属性的 bean 的 hashCode 方法?

转载 作者:行者123 更新时间:2023-12-02 11:33:20 25 4
gpt4 key购买 nike

众所周知,当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());
}
}

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

最佳答案

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

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

对于等于也可以这样说。例如,name.equals(rhs.name)将从Object调用基本实现,这与name == rhs.name相同>.

关于JavaFX:如何重写具有属性的 bean 的 hashCode 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49122716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com