我已经使用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-类
com.utilities.domain.units.UnitSystem
units.UnitSystem-
org.springframework.boot.devtools.restart.classloader.RestartClassLoader@42d353e2
units.UnitSystem-类
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;
}
因为希望Hibernate能够创建子类代理,所以不能使
UnitSystem
类final
成为可能,因此您不能绝对保证UnitSystem
不会被非Hibernate代码子类化,但是真的需要这样的绝对保证吗?关于java - Java等于对同一类的两个对象的实现,当检查getClass()时返回false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52993390/