我已经使用 NetBeans 的默认设置为对象实现了 hashCode()
和 equals()
:
@Override
public int hashCode() {
int hash = 5;
hash = 37 * hash + this.unitSystemID;
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
LOGGER.debug(getClass().toString());
LOGGER.debug(this.getClass().getClassLoader().toString());
LOGGER.debug(obj.getClass().toString());
LOGGER.debug(obj.getClass().getClassLoader().toString());
if (getClass() != obj.getClass()) {
return false;
}
final UnitSystem other = (UnitSystem) obj;
if (this.unitSystemID != other.unitSystemID) {
return false;
}
return true;
}
在日志检查点,我得到:
units.UnitSystem - class com.utilities.domain.units.UnitSystem
units.UnitSystem - org.springframework.boot.devtools.restart.classloader.RestartClassLoader@42d353e2
units.UnitSystem - class com.utilities.domain.units.UnitSystem_$$_jvst6b1_19ed
units.UnitSystem - org.springframework.boot.devtools.restart.classloader.RestartClassLoader@42d353e2
此时相等失败,equals
返回 false。
额外的_$$_jvst6b1_19ed
是什么?它从哪里来?
据我了解,如果这些类来自同一个类加载器,那么它们应该是相等的。我在其他地方使用过此实现,但没有遇到任何问题。为什么 getClass()
返回不同的东西?
最佳答案
除非您自己实际子类化 UnitSystem
,否则不需要精确的类匹配,因此请替换
if (getClass() != obj.getClass()) {
return false;
}
与
if (! (obj instanceof UnitSystem)) {
return false;
}
你不能创建 UnitSystem
类 final
因为你希望 Hibernate 能够创建一个子类代理,所以你不能绝对保证 UnitSystem
不会被非 Hibernate 代码子类化,但真的需要这样的绝对保证吗?
关于当检查 getClass() 时,同一类的两个对象的 Java equals 实现返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993390/