我已经使用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能够创建子类代理,所以不能使UnitSystemfinal成为可能,因此您不能绝对保证UnitSystem不会被非Hibernate代码子类化,但是真的需要这样的绝对保证吗?

关于java - Java等于对同一类的两个对象的实现,当检查getClass()时返回false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52993390/

10-10 13:40