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,.....)
简化。
属性不会覆盖 hashCode
和 equals
。您可以通过转到他们的文档页面(例如 StringProperty
)并向下滚动到显示 "Methods inherited from class java.lang.Object
" 的位置来验证这一点。如果列出 hashCode
和 equals
,则不会覆盖它们。
因此,例如,name.get().hashCode()
是正确的。 name.hashCode()
将 return 由 Object
定义的身份哈希码。
equals
也是如此。例如,name.equals(rhs.name)
将从 Object
调用基本实现,这与 name == rhs.name
.
相同
众所周知,当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,.....)
简化。
属性不会覆盖 hashCode
和 equals
。您可以通过转到他们的文档页面(例如 StringProperty
)并向下滚动到显示 "Methods inherited from class java.lang.Object
" 的位置来验证这一点。如果列出 hashCode
和 equals
,则不会覆盖它们。
因此,例如,name.get().hashCode()
是正确的。 name.hashCode()
将 return 由 Object
定义的身份哈希码。
equals
也是如此。例如,name.equals(rhs.name)
将从 Object
调用基本实现,这与 name == rhs.name
.