У меня есть класс школы:действует и эффективная реализация хэш-код()
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», но это будет бесполезно, так как ваш класс не будет работать в «HashMap's» и «HashSet's». Для чего вы используете этот метод 'equals'? –
Я думаю, что лучше всего оставить 'equals' и' hashCode' самостоятельно и создать метод, который проверяет это. Причиной переопределения этих методов является то, что 'Collection' соблюдает равенство, используя ваш метод 'equals', а не по умолчанию, который использует' == '. –