21

重複の可能性:
Java: 常に equals をオーバーライドしますか?

equals作成したクラスの関数をオーバーライドする必要がありますか?

いくつかの非常に単純な属性のみを含む非常に単純なクラスの場合でも、等号によって、そのすべての属性が等しく なる必要がありますか?

4

3 に答える 3

32

作成したクラスの equals 関数をオーバーライドする必要がありますか?

equalsオブジェクトが「何らかのデータを表す」場合、つまりPersonCarまたはなどをモデル化する場合RecipieIngredient(これらは通常、コレクションなどになります) にオーバーライドします。LoginServletor など、他のタイプのクラスの equals をオーバーライドしないでくださいDatabaseUtil

hashCodeオーバーライドするときは常にオーバーライドすることを忘れないでくださいequals

(自然なフォローアップの質問:) equals と hashCode をオーバーライドしないとどうなりますか?

2 つのオブジェクトは、まったく同じオブジェクトでない限り、等しくないと見なされます。

[...] すべての属性が等しい必要がありますか?

通常ははい。それは、平等の概念をどのように定義するかによって異なります。参照型の場合、独自の実装時に(and )のオブジェクト実装を利用/委譲できることに注意してください。equalshashCode

関連する質問:

于 2012-06-13T08:08:29.970 に答える
16

equals()オーバーライドする理由がある場合にのみオーバーライドする必要があります。ここで説明するようにequals()、非最終クラスまたは可変クラスに対して適切なメソッドを作成することは非常に困難です。

アプリケーションが「同一のオブジェクト」とは異なるある種の平等の概念を必要とする場合は、必ず先に進んでください。上記のリファレンスを読んで、何が関係しているかを確認してください。しかし、ルーチンの問題として?絶対にありません。

于 2012-06-13T08:14:49.907 に答える
2

実生活で考えると、equals()をオーバーライドするという概念はより理解されています。

Equalsメソッドは、2つのオブジェクトが論理的に等しい必要がある場合にのみオーバーライドする必要があります。また、恐れている場合は、プログラムのどこかでオブジェクトが再作成される可能性があるため、equals()をオーバーライドする必要があります。

非常に良い例は、JavaのStringオブジェクトです。

   String string1= new String("hello");

   String string2= "hello";

それらは等しいですか?..はい、絶対にそれらは..論理的にはですが。JavaがすでにStringequals()メソッドをオーバーライドしているため、それらの同等性を確認できます。

ご存知のとおり、クラスは実際にはそのオブジェクトのテンプレートです。それで、会社の従業員が保持できる属性を実際に決定する従業員クラスがあり、会社の実際の従業員がこのクラスのオブジェクトであると考えてみましょう。したがって、通常、従業員の属性は次のようになります。

1.従業員名

2.従業員ID

3.生年月日。。。..。。。。。。

したがって、この場合、equalsメソッドで従業員IDが等しいかどうかを確認する必要があります。しかし、ええ、オブジェクトにそのような明確な属性がない場合は、先に進んでほぼすべての値をチェックし、プログラムで2人の異なる人が等しいと見なされないようにする必要があります。

于 2012-06-13T09:29:07.033 に答える