Я столкнулся со странным результатом в Java-приложении (пакетное задание Spring) после того, как была обновлена одна из внутренних пользовательских зависимостей - библиотека, которую мы разработали в моей компании.После обновления в коде два новых объекта одного и того же типа показывают одинаковый хэш-код.
CustomObject oj1 = new CustomObject();
oj1.setId(1234L);
CustomObject oj2 = new CustomObject();
oj2.setId(9999L);
System.out.println(oj1); //Prints CustomObject@1
System.out.println(oj2); //Prints CustomObject@1
System.out.println(oj1.hashCode()); //Prints 1
System.out.println(oj2.hashCode()); //Prints 1
Я заметил эту проблему после того, как понял, что один из модульных тестов с переменной HashSet был толькодобавление самого первого объекта и игнорирование остатков.Очевидно, hashSet делает то, что должен делать, но объекты не должны быть одинаковыми и являются новыми экземплярами с разными идентификаторами.Я тестировал то же самое вне модульного теста в приложении и все еще ту же проблему.Как только я возвращаюсь к старому коду зависимостей, он ведет себя нормально, и приведенные выше операторы печати показывают разные числа!Я уверен, что одна из зависимостей вызывает эту проблему, но я не могу определить основную причину.CustomObject извлекается косвенно через ту же самую зависимость и не имеет реализованных equals () и hashcode (), он имеет только
private static final long serialVersionUID = 1L;
Просмотр источника CustomObject показывает эту реализацию
public class CustomObject extends BaseModel implements Serializable
и в BaseModel определены методы equals и hashCode
import org.jvnet.jaxb2_commons.lang.*;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import java.io.Serializable;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BaseModel")
@XmlSeeAlso({
CustomObject.class
})
public abstract class BaseModel implements Serializable, Equals2, HashCode2
{
private final static long serialVersionUID = 1L;
public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
if ((object == null)||(this.getClass()!= object.getClass())) {
return false;
}
if (this == object) {
return true;
}
return true;
}
public boolean equals(Object object) {
final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
return equals(null, null, object, strategy);
}
public int hashCode(ObjectLocator locator, HashCodeStrategy2 strategy) {
int currentHashCode = 1;
return currentHashCode;
}
public int hashCode() {
final HashCodeStrategy2 strategy = JAXBHashCodeStrategy.INSTANCE;
return this.hashCode(null, strategy);
}
}
Заранее спасибо.