2012-10-16 15 views
5

Istnieją dwa rodzaje równań metod?Czy istnieją dwa rodzaje równań() metoda

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
    } 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) 
     return false; 
    Bigram b = (Bigram) o; 
    return b.first == first && b.second == second; 
} 

porównać z metodami 2, gdy chcemy zastąpić jednakową metodę, dlaczego musimy zdefiniować równości metodę, której parametr jest typu Object!

Odpowiedz

6

Jest rzeczywiście dobry powód do tego:

  • Trzeba metodę equals(Object) przesłonić superklasę równy sposób w java.lang.Object
  • często również chcą przeciążenia equals(Bigram) metodę, która obsługuje sprawy gdzie kompilator może dowieść, że typem jest Bigram w czasie kompilacji. Poprawia to wydajność, unikając sprawdzania/odlewania typu i daje lepsze sprawdzanie typu w kodzie.
  • Na koniec możesz zaimplementować equals w specjalny sposób do testowania z równością z obiektami, które same nie są instancją Bigram. Powinno to być używane z ostrożnością (czy naprawdę chcesz, aby coś, co nie jest instancją Bigram, było uważane za równe Bigram?), Ale ma pewne ważne aplikacje (np. Porównywanie zawartości różnych typów obiektów kolekcji).

Zwykle jednak najlepiej jest realizować je tak, że jedna metoda wywołuje inny, np:

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
} 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) return false; 
    return equals((Bigram)o); 
} 

Ten sposób jest bardziej zwięzły i oznacza, że ​​trzeba tylko wdrożyć równości testowania logiki raz (Nie powtarzaj się!).

2

Ramy/API, które wymagają equals() metodę (jak containsKey() w mapach, w listach itp) zadzwonić Zastępowana equals() z klasy Object, a nie wersji przeciążony. Dlatego musisz potrzebujesz, aby zdefiniować public boolean equals(Object obj).