Nadpisanie metody equals i hashCode

0

Witajcie. Chcę nie pozwolić na stworzenie obiektu pewnej klasy, jeśli dwa pola będą się powtarzały z polami jakiegoś innego obiektu. Dla przykładu:

class Uczen{
    String imie;
    String nazwisko;
    double sredniaOcen;
}

I teraz załóżmy, że chcę żeby nie można było utworzyć obiektu klasy uczeń jeśli istnieje już taki obiekt który ma takie same (imie && nazwisko). Mniej więcej rozumiem o co chodzi w hashCode, że jest to coś jak suma kontrolna tylko w programie wykorzystywana do szybszego porównywania danych. Jednak jak to połączyć z equals? Czy ktoś mógłby zaproponować taką metodę i pokrótce wyjaśnić jej działanie? Byłbym bardzo wdzięczny.

3

Metoda hashCode() jest wykorzystywana przez niektóre kolekcje (Hashtable, HashMap, HashSet). Java dzięki tej metodzie grupuje sobie obiekty. Dzięki temu gdy sprawdzamy czy jakiś obiekt znajduje się w kolekcji Java nie musi porównywać szukanego obiektu z każdym, który jest w kolekcji, tylko porównuje je z tymi, które mają ten sam hash.

Metoda equals() z kolei porównuje dwa obiekty ze sobą na podstawie zaprogramowanych przez programistę kryteriów. Metoda equals() sama w sobie nie używa metody hashCode(), w Javie po prostu istnieje kontrakt, który polega na tym, że dwa identyczne obiekty muszą zwracać ten sam hash, ale dwa obiekty zwracające tan sam hash nie muszą być identyczne. W związku z tym programista musi napisać metody equals() i hashCode() w taki sposób aby były zgodne z tym kontraktem. Ponadto implementując metodę equals() powinniśmy również zaimplementować metodę hashCode().

0

Krótkie wyjaśnienie:

0

Co do nie pozwolić na tworzenie - to nie ma sensu - pozwól na tworzenie. (new).
To co chcesz zrobić (tylko o tym nie wiesz) - to np. trzymaj wszystkich Uczn w kolekcji HashSet<Uczen>. I sprawdzaj przed dodaniem do kolekcji czy on tam jest: (contains(nowoDodanyUczen), kóre zreszstą w środku wywoła equals) i jak się okaże że już jest taki uczeń -to daj uzytownikowi komunikat: *Jest już taki uczeń i nie wolno go dodać drugi raz. Ty niedobry.,,, *

equals i hashCode takie jakie chcesz możesz sobie wygenerować przez IDE

mi wyszło takie:

   @Override
   public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      Uczen uczen = (Uczen) o;

      if (imie != null ? !imie.equals(uczen.imie) : uczen.imie != null) return false;
      return nazwisko != null ? nazwisko.equals(uczen.nazwisko) : uczen.nazwisko == null;
   }

   @Override
   public int hashCode() {
      int result = imie != null ? imie.hashCode() : 0;
      result = 31 * result + (nazwisko != null ? nazwisko.hashCode() : 0);
      return result;
   }

ale alternatywa

 @Override
   public boolean equals(Object o) {
      if (this == o) return true;
      if (o == null || getClass() != o.getClass()) return false;

      Uczen uczen = (Uczen) o;

      if (imie != null ? !imie.equals(uczen.imie) : uczen.imie != null) return false;
      return nazwisko != null ? nazwisko.equals(uczen.nazwisko) : uczen.nazwisko == null;
   }

   @Override
   public int hashCode() {

      return 1;
   }

też będzie działać - spełnia warunki - po prostu nie będzie super efektywna :-)
ale jak masz tych uczniów do 30 to jest całkiem ok.

0

Dziękuję. Zrozumiałem, zastosowałem, zwyciężyłem! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1