2011-08-07 18 views
23

Jeśli zaimplementuję java.lang.Comparable dla klasy, czy nadal muszę przesłonić metodę equals()? Czy też Comparable będzie działać również dla equals?java.lang.Comparable i jest równa

Jeśli odpowiedź brzmi no, to co się stanie, jeśli pojawią się jakieś rozbieżności? Powiedzmy, że sposób, w jaki określam dwa obiekty jako równe w metodzie equals(), różni się od sposobu, w jaki określam dwa obiekty tej samej klasy jako równe w compareTo() z .

Co więcej, jeśli zaimplementuję Comparable, czy muszę również przesłonić equals()?

Odpowiedz

26

Chociaż zaleca (i całkiem sensowne), że posiadanie a.compareTo(b) == 0 oznacza, że ​​a.equals(b) (i wizy versa), to nie wymagane. Comparable jest przeznaczony do stosowania przy zamawianiu serii obiektów, podczas gdy equals() to tylko testy dla równości prostej.

This link ma dobre informacje na temat prawidłowego wdrożenia compareTo.

+0

+1 Oto link do odpowiednich rozdziałów skuteczna Javy (patrz punkt 11) http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD Dzięki za link. To (co nie dziwi) mówi to lepiej niż ja! – dlev

+0

@MbyD dzięki za link. Czy można wzywać a.compareTo (b) lub compare() bezpośrednio? – aps

7

Od Javadoc z java.lang.Comparable:

Zaleca się (choć nie wymagane), że naturalne uporządkowania być zgodne z równymi.

0

powiedzmy tak, jak termin dwa obiekty jako równe ciągu równych() metoda różni się od sposobu I termin dwóch obiektów tej samej klasy jako równy w ramach ToCompare() porównywalnego?

Jeśli to zrobisz, i umieścić te obiekty w posortowane ustawić, zestaw będzie źle się zachowywać. From the docs on SortedSet:

Zauważ, że kolejność utrzymywany przez uporządkowany zestaw (czy też nie wyraźny porównawczy jest zaopatrzony) musi być zgodny z równymi jeśli klasyfikowane Ustaw jest poprawnie zaimplementować interfejs Set.

Na przykład TreeSet mogą (błędnie) zawierają dwa obiekty gdzie

a.compareTo(b) != 0 

chociaż

a.equals(b) == true 
+1

Wszystkie operacje 'TreeSet' są wykonywane za pomocą' compareTo' - więc obiekty, dla których porównanie zwraca '! = 0' są uważane za odrębne, a obiekty, dla których porównanie zwraca' == 0' są identyczne (i dlatego tylko pierwszy z nich jest dodany do zestaw jest rzeczywiście zachowany). Jak mówi Javadoc: "Zachowanie uporządkowanego zbioru jest dobrze zdefiniowane, nawet jeśli jego uporządkowanie jest niespójne z równymi; po prostu nie stosuje się do ogólnej umowy interfejsu Set. " –