następujące klasy:Zmienne obiekty i 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));
}
}
produkuje następujące wyniki:
30814 29853 false true true
Ponieważ hashCode zależy od stanu obiektu, nie może dłuższe, gdy zostaną poprawnie pobrane, więc sprawdzenie zgodności nie powiedzie się. HashSet nie działa poprawnie. Rozwiązaniem byłoby uczynienie Członka niezmiennym, ale czy to jedyne rozwiązanie? Czy wszystkie klasy dodane do HashSets powinny być niezmienne? Czy istnieje jakakolwiek inna metoda radzenia sobie z sytuacją?
Pozdrawiam.
Dlaczego kompilator nie wymusza reguły nie zezwalającej na modyfikowanie obiektów jako kluczy w tablicach skrótów lub obiektach w zestawach skrótów? Wydaje mi się to okropne. – ncmathsadist