2016-08-21 6 views
0

equals()メソッドはComparatorインターフェイスにありますが、Comparableインターフェイスには存在しません。どうして?また、equals()とhashcode()の間の契約に従って、どちらもオーバーライドする必要がありますが、Comparatorの場合はそうではありません。どうして ?誰でも私の背後にあるコンセプトを理解するのを助けることができますか?equals()にはComparatorがありますが、JavaのComparableインターフェイスにはありません

+0

「コンパレータ」は別の問題を解決します。 – tkausl

答えて

2

equals()メソッドはComparatorインターフェイスにありますが、Comparableインターフェイスには存在しません。どうして?

Comparator.equalsオブジェクトがこのコンパレータから等しい場合(...)テストのためです。比較可能な2つのオブジェクトが等しいかどうかをテストするためにはではなく、です。 (だからこそ、Objectという2つではなくObjectという2つではありません)。Comparatorがそれを宣言しているからといって、Comparableがそれを宣言する理由はありません。

コンパイラが(すべてのタイプのように)Objectのサブタイプであるため、Comparatorがなぜそれを宣言しているのかを依頼する価値はあります。その理由は、単にComparatorがequals(...)にいくつかの余分な要件を課したいので、特定のJavadocを提供する必要があるからです。 Comparatorの実装では、Objectからequals(...)を使用するか、カスタムequals(...)を定義するだけで、この要件を満たすことができます。

また、equals()とhashcode()の間の契約に従って、どちらもオーバーライドする必要があります。これはComparatorのケースではありません。

コンパレータは、実際には等号(...)を「上書き」しません。 Comparatorの実装者は、Object.equals(...)をオーバーライドしない限り、継承します。

Comparalsがequals()の実際の実装を提供していないので、—はいくつかの追加要件を指定するだけです。— hashCode()について特別なことを言う必要はありません。 hashCode()の一般規約およびhashCode()とequals()の関係は引き続き適用されます。

1

Comparableを実装しているクラスには、すでにObjectから継承されたequalsメソッドがあり、Comparalsはequals()に余分な制約を課していません。

コンパレータでは、MyComparatorType.equals(Comparator other)がtrueを返すには、コンパレータと他のコンパレータの両方で同じ順序が指定されている必要があります。これにより、いくつかのパフォーマンスの向上と最適化が可能になり、この特別な契約に違反した場合、ある時点でランタイム例外が発生する可能性があります。

the Comparator javadocから関連する行:

は、いくつかの他のオブジェクトがこのコンパレータ「等しい」であるかどうかを示します。このメソッドは、Object.equals(Object)の一般規約に従わなければなりません。

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

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

はコンパレータ正しいのhashCode()の挙動を含んではObject.equals(Object)を実装し、他のものと同じ契約に従ってください。

0

equals(Object obj)はすべてのクラスに存在する。それはObjectクラスから来ます。 Comparatorインタフェースで

equals(Object obj)宣言は、クライアントがこのクラスのequals()メソッドをオーバーライドする関心を認識するようにするために、関連するJavadocをオーバーライドするために添加されます。それはヒントです。コンパレータでequals(Object obj)

のJavadoc:

ほかのオブジェクトがこのコンパレータ "に等しい" であるかどうかを示します。 このメソッドは、Object.equals(Object)の一般規約に従わなければなりません。 さらに、このメソッドは、指定されたオブジェクト もコンパレータであり、この コンパレータと同じ順序付けを行う場合にのみ、trueを返します。したがって、comp1.equals(comp2)は、 オブジェクト参照o1およびo2ごとに sgn(comp1.compare(o1、o2))== sgn(comp2.compare(o1、o2))を意味します。

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

ポイントは何ですか? 異なるコンパレータでCollections.sort()メソッドを何度も呼び出す必要があるとします。 2つのコンパレータがequals()で、すでに1つのコンパレータを適用している場合は、2番目のコンパレータは適用しないでください。言われたように、それはヒントです。

Comparableでは、JDK開発者はequalsメソッドオーバーライドに関する情報を追加すると便利ではないと判断しています。オブジェクトのequals(Object obj) Javadocで十分です。

関連する問題