Изменяемые объекты и хэшкодJAVA

Программисты JAVA общаются здесь
Anonymous
Изменяемые объекты и хэшкод

Сообщение Anonymous »

Иметь следующий класс: < /p>

Код: Выделить всё

public class Member {

private int x;
private long y;
private double d;

public Member(int x, long y, double d) {
this.x = x;
this.y = y;
this.d = d;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = (int) (prime * result + y);
result = (int) (prime * result + Double.doubleToLongBits(d));
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Member) {
Member other = (Member) obj;
return other.x == x && other.y == y
&& Double.compare(d, other.d) == 0;
}
return false;
}

public static void main(String[] args) {
Set test = new HashSet();
Member b = new Member(1, 2, 3);
test.add(b);
System.out.println(b.hashCode());
b.x = 0;
System.out.println(b.hashCode());
Member first = test.iterator().next();
System.out.println(test.contains(first));
System.out.println(b.equals(first));
System.out.println(test.add(first));
}

}
< /code>
дает следующие результаты: < /p>
30814
29853
false
true
true
Поскольку метод HashCode зависит от состояния объекта, который он больше не может быть полученным, поэтому проверка на наличие сдерживания не удастся. HASHSET больше не работает должным образом.
Решение будет заключаться в том, чтобы сделать Member неизменным, но это единственное решение? Должны ли все классы, добавленные в Hashsets, быть неизбежными? Есть ли другой способ справиться с ситуацией?>

Подробнее здесь: https://stackoverflow.com/questions/471 ... d-hashcode

Вернуться в «JAVA»