Wpis z mikrobloga

#programowanie #java #pytanie

Mirki, tak się zastanawiam zainspirowany rozmową o pracę, czy jest jakiś obowiązek żeby implementacja metody .equals() szła w parze z implementacją .hashCode() ? Zgodnie z tym co przeczytałem, założenie jest takie:

Jeżeli a.equals(b) to a.hashCode() musi być równy b.hashCode().

No i wszystko pięknie. Weźmy jednak taki kodzik: http://pastebin.com/CFa9S3Jd
Klasa B spełnia powyższy warunek. Wiem, że nie jest to dobre rozwiązanie, wręcz szkodliwe. Interesuje mnie czysto teoretyczne podejście do tego pytania. Czy jest może jeszcze jakieś dodatkowe założenie dla tych dwóch metod?
  • 10
@gress: Tylko to, co podałeś. Jeśli hashcode'y sie zgadzają to equals nie musi zwracać true. Te założenia są ważne dla HashMap, HashSet i innych takich klas, które najpierw na szybko sprawdzają po hashcode czy dany obiekt już jest w kolekcji. Jeśli kilka obiektów ma taki sam hash to wtedy dla pewności wywoływany jest equals.

Jeśli rozjadą Ci się implementacje tych metod to przy użyciu w kolekcjach możesz natrafić na bardzo dziwne
@NiebieskaSowa: Czytałeś to w ogóle czy ctrl+c i ctrl+v z googli?

@Edhendil: Czyli w teorii coś takiego jest zgodne z założeniami? Sam w sumie nie wiem, jak to nazwać. Wiem, że pisanie czegoś takiego jest proszeniem się o krzywdę niczym danie brzytwy małpie. Jestem jednak dociekliwy i jeśli ktoś zadaje mi "Czy można" to odpowiedam "Można", po czym dodaje dlaczego jest to niewłaściwe. Rekruter jednak twierdził, że nie można bo