Java: внешний класс для определения эквивалентности? - PullRequest
8 голосов
/ 31 августа 2011

Java имеет Comparator<T> для обеспечения сравнения объектов, внешних по отношению к самому классу, для обеспечения нескольких / альтернативных методов выполнения упорядоченных сравнений.

Но единственный стандартный способ неупорядоченных сравнений - это переопределить equals() в классе.

Что мне делать, если я хочу предоставить несколько/ альтернативные неупорядоченные сравнения, внешние по отношению к классу? (Очевидный вариант использования - разбиение коллекции на классы эквивалентности на основе определенных свойств.)

Предполагается, что конечное использование предназначено для неупорядоченной проверки (например, не для сортировки или индексации).), когда-нибудь нормально реализовать Comparator<T>, который просто проверяет равенство, возвращая 0, если два объекта равны, и значение! = 0, если два объекта неравны?( примечание : единственная причина, по которой я не использую это решение, заключается в том, что технически он может нарушить контракт для Comparator, не предоставив отношения, удовлетворяющего транзитивности и симметрии.)

Кажется, должен был быть EqualsComparator<T> стандартный класс или что-то в этом роде.

(Guava обрабатывает что-нибудь подобное?)

1 Ответ

14 голосов
/ 31 августа 2011

Да, Guava имеет интерфейс Equivalence и класс Equivalences (Удалено в выпуске Guava 14.0).

(И да, это то, что очень полезно и, к сожалению, отсутствует в Java. У нас действительно должны быть варианты для HashMap, HashSet и т.д ...)

Хотя Comparator<T> может быть в порядке в некоторых ситуациях, он не предоставляет метод hashCode, который был бы важен для коллекций на основе хеша.

...