Правильная и эффективная реализация 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() должен вернуть уникальное значение для объекта. Возврат им нескольких значений приводит к неоднозначности (и вредит определенности) для помещения объекта на любую карту. Потому что это является нарушением предположения об "уникальности ключей карты".

Другие вопросы по тегам