avere la seguente classe:oggetti mutabili e 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 i seguenti risultati:
30814 29853 false true true
Perché la hashCode dipende dello stato dell'oggetto non può più a lungo recuperato correttamente, quindi il controllo per il contenimento fallisce. HashSet non funziona più correttamente. Una soluzione sarebbe quella di rendere i membri immutabili, ma è l'unica soluzione? Tutte le classi aggiunte a HashSet dovrebbero essere immutabili? C'è un altro modo per gestire la situazione?
Saluti.
Perché il compilatore non applica una regola per non consentire gli oggetti mutabili come chiavi nelle tabelle hash o negli oggetti nei set hash? Questo mi sembra orribile. – ncmathsadist