2 Изменяемые переменные в суперклассе 1 Уникальный идентификатор в подклассе. Как лучше переопределить методы equals и hashcode - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть суперкласс с int a и int b.Эти переменные являются изменчивыми.Этот суперкласс имеет 2 метода, которые могут изменять значения int a и int b для любых экземпляров объекта, созданных из него.

У меня есть подкласс, унаследованный от суперкласса (extends), а также переопределяет 2 метода суперкласса для добавленияулучшенная функциональность, которой не хватало в суперклассе. У подкласса есть 1 переменная экземпляра, которая является уникальным идентификатором.Я хотел показать переопределение метода equals и hashcode для суперкласса и подкласса.Вероятно, это не нужно делать, но я хотел переопределить equals и hashcode для одного или обоих классов в соответствии с моей ситуацией.

Суперкласс не имеет уникальной переменной экземпляра id.Объекты суперкласса уникальны, и я хотел показать это в методах equals и hashcode, сравнивая суперкласс int a и int b с экземпляром суперкласса int a и int b.Это возможно?Я не хотел использовать метод equals по умолчанию, который сравнивает равенство, используя ссылку на память для двух сравниваемых объектов.

Я также хотел показать объекты подкласса, используя Int c (уникальный идентификатор), int a и intb как уникальный в методе equals.

могу ли я выполнить проверки на равенство как в методах equals суперкласса, так и в методах equals подкласса, или это немного бессмысленно?Я не хотел использовать проверку ссылок на память по умолчанию, но хотел показать равенство или уникальность, используя мои 2 изменяемые переменные типа int (суперкласс) и 1 уникальный идентификатор (подкласс)

Нужно ли мне проверятьравенство, если я переопределяю суперклассы равно и подкласс равны, зная, что правила равенства нарушены?

Могу ли я просто переопределить методы равенства и хэш-кода надкласса, было бы лучше для моей ситуации?

Любая помощь высоко ценится

1 Ответ

0 голосов
/ 16 декабря 2011

Здесь в основном две разные философии:

a) sub расширяет super, поэтому sub.equals () и sub.hashCode () делегируют super.equals () и super.hashCode ()

b) каждый класс отвечает за выполнение своих собственных контрактов, sub.equals () и sub.hashCode () будут рассматривать родительские поля, ссылаясь на них через геттеры (super.getXyz()).

Оба эти подхода действительны. В подходе a) super.equals () проверяет совместимость instanceof, в подходе b) super.equals () сравнивает this.getClass() с that.getClass(). Проблема с подходом а) состоит в том, что он даст вам асимметричные сравнения (). В некоторых случаях sub.equals (super) будет false, но super.equals (sub) будет true.

Прочтите пункты 8 и 9 Effective Java для получения дополнительной информации.

...