У меня есть класс, содержащий коллекцию. Два экземпляра класса равны, если содержимое коллекции равно. Пока я строю свою структуру данных, я храню класс в HashSet, и содержимое коллекции изменяется. Изменения приводят к изменению значения хэш-кода. Это, по-видимому, вызывает побочные эффекты, когда мои данные теряются в наборе. Удаление коллекции из расчета хэш-кода устраняет проблему, но нарушает правило, в котором все поля в equals должны использоваться в хэш-коде.реализация hashcode на java-классах, содержащих коллекции
Как бы вы реализовали hashcode в этой ситуации?
public class LeveZeroHolder
{
private final Set<LevelOneHolder> orgGroups = new HashSet<LevelOneHolder>();
private final String name;
public LeveZeroHolder(String name, LevelOneHolder og)
{
this.name = name;
orgGroups.add(og);
og.setFA(this);
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null || obj.getClass() != getClass())
return false;
LeveZeroHolder hobj = (LeveZeroHolder)obj;
return getOrgGroups().equals(hobj.getOrgGroups()) && getName().equals(hobj.getName());
}
@Override
public int hashCode()
{
int rs = 17;
rs = rs * 37 + ((getName() == null) ? 0 : getName().hashCode());
rs = rs * 37 + ((getOrgGroups() == null) ? 0 : getOrgGroups().hashCode());
return rs;
}
public String getName()
{
return name;
}
public Set<LevelOneHolder> getOrgGroups()
{
return orgGroups;
}
public void addOrgGroup(LevelOneHolder o)
{
o.setFA(this);
orgGroups.add(o);
}
}
Не могли бы вы объяснить свою модель немного больше? Что такое LevelZeroHolder и LevelOneHolder? Хэш-код в идеале не должен меняться на протяжении всего жизненного цикла объекта, поэтому я хотел бы понять, почему эта коллекция находится в вашем хэш-коде, в первую очередь. Нужно ли это быть? – alpian
Что вы подразумеваете под «Это, по-видимому, вызывает побочные эффекты, когда мои данные потеряны»? – assylias
Код выглядит корректно для меня. Я не вижу ничего, что могло бы привести к потере данных при добавлении объекта. –