Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does Comparator declare equals?

The Comparator interface has its own equals() method. Any class will get equals() by default through Object class. What is the need to have equals() method inside an interface?

like image 419
sagar sinha Avatar asked Jun 13 '12 11:06

sagar sinha


3 Answers

Comparator refines the contract of Object.equals: It has to satisfy the constraints set out by Object.equals and then some.

Additionally, this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator. Thus, comp1.equals(comp2) implies that sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) for every object reference o1 and o2.

Declaring an equals inside Comparator allows you to document this in the form of javadoc.

Note that the documentation of the API also serves as the contract, so it's not just cosmetics here. It's explicit constraints that other code and your code can rely on.

In similar situations where you have less established methods, it may also serve as documenting an intent. I.e., Interface.method should be there, regardless of how its super interfaces evolves.

like image 82
aioobe Avatar answered Nov 15 '22 11:11

aioobe


From the Java documentations, the reason why Comparator has it's own equals() method:

However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.

like image 40
Kazekage Gaara Avatar answered Nov 15 '22 11:11

Kazekage Gaara


Read its javadoc. It's there only to explain what equals() must return if you choose to override it in a class implementing Comparator. You might think that no comparator can be equal to any other, but it's not the case. You might think that two comparators are equal if they return the same thing for any arguments, but it's not the case. The javadoc explains that two comparators are equal if they impose the same ordering, whatever the arguments given. The javadoc also says:

Note that it is always safe not to override Object.equals(Object)

Most of the time, you don't override equals() in comparators.

like image 24
JB Nizet Avatar answered Nov 15 '22 10:11

JB Nizet