Правильная и эффективная реализация hashcode()
У меня есть классная школа:
public class School{
private int noOfTeachers;
private int noOfStudents;
//setters and getters....
public boolean equals(Object that){
//instance of check..
return (this.noOfTeachers == ((School)that).noOfTeachers ||
this.noOfStudents== ((School)that).noOfStudents);
}
public int hashCode(){
//What goes in here??? o.O
}
}
Как мне следует приступить к реализации hashCode
для этого класса? Я не могу придумать стратегию, которая будет включать как noOfTeachers
а также noOfStudents
для расчета хеша. Скорее noOfTeachers
а также noOfStudents
комбинация, кажется, нарушает договор между equals
а также hashCode
,
1 ответ
Вы не найдете подходящего hashCode()
реализация для вашего класса, которая будет служить вашим потребностям! Потому что ваш equals
метод использует OR
к его свойствам вашего класса. С помощью OR
в equals
метод возвращает true
для более чем одного состояния любого объекта.
Таким образом, используя уникальное возвращаемое значение hashCode()
Вы, конечно, не можете представлять несколько состояний! И более того, вы должны знать, hashCode()
должен вернуть уникальное значение для объекта. Возврат им нескольких значений приводит к неоднозначности (и вредит определенности) для помещения объекта на любую карту. Потому что это является нарушением предположения об "уникальности ключей карты".