26

Comparatorインターフェースには独自のequals()メソッドがあります。すべてのクラスはequals()、デフォルトでObjectクラスを介して取得されます。equals()インターフェイス内にメソッドを含める必要はありますか?

4

8 に答える 8

10

Comparatorのコントラクトを改良しObject.equalsます: それは によって設定された制約を満たさなければなりませObject.equals

さらに、このメソッドは、指定されたオブジェクトがコンパレーターでもあり、このコンパレーターと同じ順序を課す場合にのみ true を返すことができます。したがって、は、すべてのオブジェクト参照に対しておよびでcomp1.equals(comp2)あることを意味します。sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))o1o2

equals内部を宣言するComparatorと、これを javadoc の形式で文書化できます。

なお、API のドキュメントはコントラクトも兼ねているため、ここでは単なる装飾ではありません。これは、他のコードとあなたのコードが依存できる明示的な制約です。

方法があまり確立されていない同様の状況では、意図を文書化する役割も果たします。つまり、Interface.methodそのスーパー インターフェイスがどのように進化するかに関係なく、存在する必要があります。

于 2012-06-13T11:31:58.167 に答える
4

そのjavadocを読んでください。equals()Comparator を実装するクラスでそれをオーバーライドすることを選択した場合に、何を返さなければならないかを説明するだけです。他のコンパレーターと同等のコンパレーターは存在しないと思われるかもしれませんが、そうではありません。2 つの比較演算子が任意の引数に対して同じものを返す場合、それらは等しいと考えるかもしれませんが、そうではありません。javadoc は、指定された引数に関係なく、2 つの比較演算子が同じ順序を課す場合、それらが等しいことを説明しています。javadoc にも次のように書かれています。

Object.equals(Object) をオーバーライドしないことは常に安全であることに注意してください。

equals()ほとんどの場合、コンパレータではオーバーライドしません。

于 2012-06-13T11:30:06.467 に答える
4

Java documentationComparatorから、独自のメソッドがある理由equals():

ただし、このメソッドをオーバーライドすると、場合によっては、2 つの異なるコンパレータが同じ順序を課すことをプログラムが判断できるようになるため、パフォーマンスが向上することがあります。

于 2012-06-13T11:27:56.167 に答える
1

技術的には、メソッドの宣言は冗長です (コンパイラーは気にしません) が...

このインターフェイスで equals メソッドを宣言すると、呼び出し元と異なる Comparator 間のコントラクトの一部になり、そのセマンティクスを指定/拡張できるようになります。

これは、compare() メソッドで同じ順序を課す場合にのみ、2 つの Comparator が等しいことを指定します。これはObject.equals() のセマンティクスを拡張するため、インターフェースで文書化する必要があります。

于 2012-06-13T11:35:29.943 に答える
1

ドキュメントから:

Object.equals(Object) をオーバーライドしないことは常に安全です。ただし、このメソッドをオーバーライドすると、場合によっては、2 つの異なるコンパレータが同じ順序を課しているとプログラムが判断できるようになり、パフォーマンスが向上することがあります

于 2012-06-13T11:30:48.387 に答える
0
Comparator interface have their own equals() method

良い、。まず第一に、 Comparable インターフェイスを実装するときはいつでも、オブジェクトが等しいか、小さいか大きいかを決定するプログラムを提供する必要があることを明確にする必要があります。

I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class.

Object クラスから継承する equals() メソッドの実装は、2 つの参照が同じオブジェクトを指しているかどうかのみをチェックします。比較対象にはなりません。クラス (または場合によってはインターフェイス) で、オブジェクトが等しいかどうかの基準を提供するのはあなたです。

Then what is need to have equals() method inside an interface?

明らかに、オブジェクトが小さい場合に実装するときはいつでも、それらが等しい場合に実装する必要があるよりも大きくなります。したがって、デフォルトの Object equals() メソッドに依存するのではなく、同等性をチェックするロジックを提供する必要があります

于 2012-06-13T11:35:18.077 に答える
0

インターフェース宣言に Object メソッドを入れると、インターフェースを実装するクラスで必要な equals の意味の Javadoc 宣言が可能になります。

于 2012-06-13T11:32:20.503 に答える
0

equals()メソッドは、インターフェースを実装するユーザーに、からすでに適用されているものに加えて、いくつかの追加のルールと制約を実装Comparatorするように強制するために提供されています。Comparatorequals()equals()Object

追加のルールは次のとおりです。

このメソッドは、 Object.equals(Object)の一般規約に従う必要があります。さらに、このメソッドは、指定されたオブジェクトがコンパレーターでもあり、このコンパレーターと同じ順序を課す場合にのみ true を返すことができます。したがって、comp1.equals(comp2)は、すべてのオブジェクト参照o1およびo2に対して sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))を意味します。

于 2012-06-13T11:30:41.203 に答える