[Java] Przekazywanie obiektu do metody equals()


(stanek.94) #1

Witam! Mógłby mi ktoś dlaczego przy metody equals() lepiej jest używać “Object” jako typu argumentu a nie konkretnej nazwy klasy?

To znaczy używać tego

 

public boolean equals(Object o) { 
Dog other = (Dog) o; //CASTING 
if (this.name.equals(other.name) 
return true; 
else 
return false; 
}

zamiast

public boolean equals(Dog other) { 
if (this.name.equals(other.name) 
return true; 
else 
return false; 
}

(Frankfurterium) #2

Equals jest metodą stosunkowo rzadko wywoływaną ręcznie, znacznie częściej używają jej różnorakie kolekcje. Nie wszystkie są parametryzowane i wtedy jedynym spólnym mianownikiem przechowywanych elementów jest właśnie Object.

 

 

btw. lepszy zapis:

return this.name.equals(other.name);

(invader92) #3

W Javie wszystkie klasy niejawnie dziedziczą po java.lang.Object, zatem metoda equals(Object o) zapewnia jednolity interfejs porównania dwóch obiektów niezależnie od tego jakich klas są instancjami. Nie oznacza to jednak, że powinno dochodzić do sytuacji, gdzie instancja klasy MyClass i instancja String dają w MyClass.equals(String) prawdę. To jest złamanie jednej z zasad programowania obiektowego. Bardziej chodzi o to, na to na co FrankFurterium położył nacisk w przypadku kolekcji. Nie zawsze będziesz w stanie określić jakiej klasy jest przychodząca instancja, ale dzięki możliwości porównania tego z czymkolwiek, odpadnie, przynajmniej na etapie wywołania equals, konieczność niebezpiecznych castów.

 

PS:


(Enterbios) #4

Jest jedna zasadnicza różnica, dosyć istotna. Pisząc metodę equals(Object obj) przeciążasz metode z klasy bazowej Object (w javie wsztskie klasy dziedziczą po Object). A więc możesz oznaczyć ją annotacją @Override:

@Override
public boolean equals(Object obj)
      return super.equals(obj);
}

Natomiast kiedy napiszesz metode equals która przyjmuje cokolwiek innego niż object to nie jest to wtedy przeciążenie metody, a po prostu zwykła metoda w klasie (możesz ją nazwać jak chcesz i tak nie będzie mieć ona właściwości equalsa). Będzie mieć to niebagatelne znaczenie kiedy zaczniesz korzystać z kolekcji w javie (jak już wcześniej koledzy wspomnieli) ale również kiedy zaczniesz budować hierarchie klas i będziesz chciał porównywać ze soba obiekty. Dobra rada - jak przeciążasz equalsa to zrób to samo z hashCode(). Więcej o tym jak poprawnie napisać equals i hashCode znajdziesz na przykład tu.