2011-08-31 11 views
7

Java ma Comparator<T> zapewniające porównywanie obiektów zewnętrznych z samą klasą, aby umożliwić wielokrotne/alternatywne metody porównywania porównań 0123.Java: klasa zewnętrzna do określania równoważności?

Ale tylko standardowy sposób robienia nieuporządkowane porównań jest przesłonić equals()ciągu klasy.

Co należy zrobić, gdy chcę wprowadzić wiele/nieuporządkowane nieuporządkowane porównania zewnętrzne względem klasy? (przypadek Oczywiste stosowanie jest podział zbioru na klasy równoważności opiera się na szczególnych właściwościach.)

Zakładając, że finalny produkt jest nieuporządkowana kontroli (np nie do sortowania lub indeksacji), czy to kiedykolwiek OK, aby wdrożyć Comparator<T> że tylko sprawdza równość, zwracanie 0, jeśli dwa obiekty są równe, a wartość! = 0, gdy dwa obiekty są nierówne? (uwaga. Jedynym powodem, dla którego nie skakać na tego rozwiązania jest to, że technicznie może zerwać kontrakt na Comparator przez nie dostarczając związek, który spełnia przechodniości i symetrii)

Wydaje się, że nie powinno być klasę standardową EqualsComparator<T> lub coś podobnego.

(Czy Guava obsłużyć coś takiego?)

Odpowiedz

13

Tak, Guava ma interfejs Equivalence i klasy Equivalences (usunięcie w Guava zwolnić 14,0).

(I tak, to jest coś, co bardzo przydatny i niestety brakuje w Javie. Naprawdę powinien mieć możliwości obejścia tego za HashMap, HashSet etc ...)

Podczas Comparator<T>może być w porządku w w niektórych sytuacjach nie zapewnia metody hashCode, która byłaby ważna w przypadku kolekcji opartych na hashach.

+0

hmmm ... oba są oznaczone jako @Beta. –

+0

@Jason: Więc używaj ostrożnie :) (Ostatecznie 'Równoważność' jest interfejsem, więc nie jest tak, że polegasz na * implementacji *, która może zniknąć.) –

+5

Mogę obiecać, że to nie zniknie, ale jest w ciągłym ruchu. Na przykład dla zbliżającej się wersji 10.0 zmieniliśmy ją na klasę abstrakcyjną i przenieśliśmy większość Equivalence bezpośrednio do niej (i prawdopodobnie zakończymy pracę w pewnym momencie). –