que la clase siguiente:objetos mutables y hashCode
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<Member> test = new HashSet<Member>();
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));
}
}
Produce los siguientes resultados:
30814 29853 false true true
Debido a que el código hash depende del estado del objeto que pueda sin más tiempo recuperado correctamente, por lo que el control de contención falla. El HashSet ya no funciona correctamente. Una solución sería hacer que el miembro sea inmutable, pero ¿es esa la única solución? ¿Deberían todas las clases agregadas a HashSets ser inmutables? ¿Hay alguna otra forma de manejar la situación?
Atentamente.
¿Por qué el compilador no hace cumplir una regla de no permitir objetos mutables como claves en tablas hash u objetos en conjuntos de hash? Esto me parece horrible. – ncmathsadist