2015-05-27 5 views
-1

Я ищу, чтобы понять это кажущееся несоответствие:Почему Comparator.compare принимает два аргумента?

Comparator.compare принимает два объекта в качестве входных аргументов и сравнивает их, ничего не делая с или this. Почему он не может быть статическим методом?

Comparator.equals принимает один другой объект в качестве входного аргумента и сравнивает его с this.

Почему существует парадигма дизайна? Почему не compare просто попросить один аргумент объекта и сравнить его с этим?

+4

Поскольку интерфейсы не работают с 'методами static'. Вы не можете вводить «Comparator» с помощью метода 'static'' compare'. –

+0

, который отвечает только на вопрос во втором абзаце. существует более крупный вопрос, обертывающий вокруг него. – amphibient

+0

. Comparator.equals используется для проверки того, равен ли этот компаратор (в котором вы определяете метод equals) любой другой объект-компаратор – Arjit

ответ

2

Реализация Comparator.equals() будет переопределение Object.equals(), и предполагается сравнить в Comparator сам другому Comparator. Таким образом, он не связан с Comparator.compare(), который должен сравнивать два объекта другого типа.

См. Ответ Четана Кингера для статической части.

+1

Почему нет сравнения, просто спросите об одном аргументе Object и сравните его с этим ? – amphibient

+2

@amphibient Для этого существует 'Comparable'. –

+2

Потому что это цель 'Comparable', которая должна быть реализована объектами, способными сравнивать себя с другими объектами.Объекты, которые не имеют такой возможности или которые могут сравниваться по-разному, могут вместо этого «перенаправлять» свое сравнение на «Компаратор». –

0

Компаратор допускает неограниченное количество возможных реализаций для данного класса. Это позволяет, например, сортировать список по нескольким различным критериям.

Предположим, что у вас есть список сотрудников. Вы можете иметь на компараторе, который будет сортировать по зарплате, а другой - сортировать по имени.

Метод equals() переопределяется из Object. Эта конструкция позволяет разработчику класса указать один и только один способ, чтобы два экземпляра считались равными. Обратите внимание, что было бы необычно переопределить equals() для класса, который специально используется в качестве компаратора.

0

В то время как ответ Сотириоса правильный, компаратор также является внешним «инструментом» для сравнения «вещей» (двух объектов), поэтому нет смысла ссылаться на компаратор на себя («эта» ссылка). Представьте себе Компаратор как пару весов: он не измеряет себя, а два разных объекта.

Для справки «this» вам необходимо реализовать другой интерфейс Comparable, который больше похож на встроенный объект «equals».

0

Почему он не может быть статическим?

A static способ нельзя переоценить. Если метод compare в Comparator был статическим, не было бы способа для класса, который реализует Comparator, чтобы определить свою собственную стратегию сравнения. Кроме того, метод static на самом деле не был бы частью контракта интерфейса Comprator. (Java 8 позволяет интерфейсам иметь статические методы)

Почему не сравнить просто попросить одного аргумента объекта и сравнить его к этому

Назначение Comparator, чтобы позволить вам определить одну или несколько стратегий сравнения, которые не являются естественной стратегией сравнения для класса. В идеале, Comparator должен быть реализован классом, отличным от того, для которого он определяет стратегию сравнения.Поэтому для Comparator не имеет смысла зависеть от ссылки this класса, для которого он определяет стратегию сравнения. Если вы хотите определить естественную стратегию сравнения для класса, вместо этого вы можете реализовать Comparable. Comparable имеет метод compareTo, который работает на this и поэтому принимает только один аргумент.

0

Comparator.compare принимает в качестве входных аргументов два объекта и сравнивает их, не делая ничего с этим или с этим. Почему он не может быть статическим методом?

Это может быть статический, но это помешает вам передать функцию сравнения в качестве аргумента для других функций. Поскольку функции не являются первоклассными гражданами на Java, вам, по сути, нужно обернуть эту единственную функцию интерфейсом, чтобы сделать его доступным.

Comparator.equals берет один другой объект в качестве входного аргумента и сравнивает его с этим. Почему существует парадигма дизайна? Почему не сравнивать просто спросить об одном аргументе Object и сравнить его с этим?

Метод equals, если для просмотра, если текущий компаратор равен некоторому другому компаратору, а не для сравнения произвольных объектов.

1

The equals - это сравнение этого компаратора с другим. Сравнение относится к двум значениям типа общего параметра.

Скажите, что вы сделали бы свой собственный API сравнения с статическими функциями. Затем вы можете передать функцию Java 8 ".

myCollection.mySort(MyComparator::compare); 

Тогда было бы сложно сделать параметризованный компаратор, скажем, с некоторыми дополнительными критериями. Статические поля не будут работать в многопоточной системе.

Вы могли бы, однако, как Java 8 строитель картины комбинируемых компараторов,

Comparator<Employee> fullNameComparator = 
     Comparator.comparing(Employee::getLastName) 
        .thenComparing(Employee::getFirstName); 
employees.sort(fullNameComparator); 
Смежные вопросы