2

の javadocObject.equals()では、メソッドを正しくオーバーライドするために従う必要がある規則について説明しています。それは言います:

  1. これは再帰的です。null でない参照値 x に対して、x.equals(x) は true を返す必要があります。
  2. これは対称的です: null 以外の参照値 x および y について、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。
  3. これは推移的です: null 以外の参照値 x、y、および z に対して、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。
  4. 一貫性があります。null 以外の参照値 x および y に対して、x.equals(y) の複数の呼び出しは一貫して true を返すか、一貫して false を返します。ただし、オブジェクトの equals 比較で使用される情報が変更されていない場合に限ります。
  5. null 以外の参照値 x の場合、x.equals(null) は false を返す必要があります。

なぜこれらの規則に従う必要があるのか​​と誰かに尋ねられた場合equals()、私が答えることができる唯一の答えは、「javadoc がそう言っているからです」です。私はそれに満足していません。これらのルールが存在する理由をより深く理解したいと思います。誰かがこれらのルールのそれぞれを調べて、違反した場合に何が問題になるかを例を挙げて説明できますか?

4

4 に答える 4

3

主な理由は、equals正しく動作するために正しい機能に依存する多くのクラスと API があるためです。最も一般的な使用法は、 s とs とs などのjava.utilパッケージ内ですが、他にも非常に多くの使用法があります。ListSetMap

の堅牢な定義を持つことで、equals並べ替えなどの機能を有効にできます。ちょっと難しい「理由」を示す代わりに、それぞれの例を示します。

  • 再帰:同じ要素を 2 回入れようとするSetと、セットに 2 回入り、重複なし機能が機能しなくなります。
  • 対称:ソート機能は非常に予測不可能です。
  • 推移的:繰り返しますが、ソート機能です。
  • 一貫性:すべてがひどく予測不可能です。
  • Null:Set s やMapsなどでは、挿入はほとんど意味がありません。

詳細については、ウィキペディアの平等に関するエントリをご覧ください。

于 2013-05-03T16:35:05.330 に答える
2

要件

これは再帰的です: null 以外の参照値 x に対して、x.equals(x) は true を返す必要があります。

説明

これは、オブジェクト X は、それ自体と比較したときに常に true を返す必要があることを示しています。それは論理的に続きます。「=」演算子について考えてみてください。

int x = 1;
int y = 1;
if(x == x) { // We expect this to be true every time }


要件

これは対称的です: null 以外の参照値 x および y について、y.equals(x) が true を返す場合に限り、x.equals(y) は true を返す必要があります。

説明

さて、これは=数学における の性質です。次のように見てください。

int x = 1;
int y = 1;
if(x == y) { // This should return true }
if(y == x) { // We expect this to have the same output as the first if }


要件

これは推移的です: null 以外の参照値 x、y、および z に対して、x.equals(y) が true を返し、y.equals(z) が true を返す場合、x.equals(z) は true を返す必要があります。

説明

繰り返しますが、一部のコードで理由を説明できます。

int x = 1;
int y = 1;
int z = 1;

if(y == x && x == z)
{
   // It only logically follows that y == z.
}


要件

一貫性があります。null 以外の参照値 x および y に対して、x.equals(y) の複数の呼び出しは一貫して true を返すか、一貫して false を返します。ただし、オブジェクトの equals 比較で使用される情報が変更されていない場合に限ります。

説明

これは一種の自明です。それが言っているのは、それが数学関数のように振る舞うということだけです。つまり、同じ入力に対して、毎回同じ出力が生成されます。


要件

null 以外の参照値 x の場合、x.equals(null) は false を返す必要があります。

説明

これは単に合意された標準です。しかしまた、論理的に持ちこたえます。equalsオブジェクトのメソッドを正常に呼び出すには、non-null. それがnon-nullであり、 に対して等しいかどうかをテストしているnull場合、等しくない必要があるため、false.

于 2013-05-03T16:36:17.253 に答える