5

JavaでデフォルトのObjectequalsメソッドを使用し、それを変更して特定のクラスで機能するようにする方がよいと考えられるのはなぜですか(instanceof型キャストを使用して検証し、使用することにより)。

public boolean equals(Object otherObject)
{
   boolean isEqual = false;

   if ((otherObject != null) && (otherObject instanceof myClass))
      {
         myClass classObject = (myClass)otherObject;

         if (.....) //checking if equal
         {
            .....
}

equals使用する必要のある各クラスに固有の新しいメソッドでオーバーロードする代わりにequals

public boolean equals(myClass classObject)
4

4 に答える 4

8

の署名はObject.equals()ですpublic boolean equals(Object)。method を定義する場合は、メソッドpublic boolean equals(MyClass)をオーバーライドする (または必要に応じて再定義する) のではなく、別の署名を使用して新しいメソッドを追加しますObject.equals()

すべてのコレクションがメソッドを呼び出すためObject.equals()、新しいメソッドは自分のコード以外から呼び出されることはなく、ほとんど役に立ちません。たとえば、 を作成するSet<MyClass>と、2 つのインスタンスが異なると見なされますが、equals(MyClass)メソッドではそれらが等しいと見なされます。

于 2012-11-25T16:17:19.463 に答える
1

これは、Java のほとんどのクラス (リスト、キュー、マップなど) がboolean equals(Object obj)メソッドを使用するためです。Java が設計されていた 90 年代には、ジェネリックは存在しませんでした。

たとえばComparatororを使用する比較メソッドComparableは、ジェネリックをサポートするように更新されたため、instanceofクラスの正しい型 ( を回避) を直接取得します。Object.equals()ジェネリックを取るだけObjectです。

.equals()新しい署名でオーバーロードすると、他のコレクションは新しいequals()メソッドを認識せず、 によって提供された古い元のメソッドを引き続き呼び出すObjectため、それに固執して を使用する必要がありますinstanceof。オーバーロードには、オーバーライドと同じ効果がないことに注意してください。サブクラス メソッドをオーバーライドすると、シグネチャがまったく同じであるため、サブクラス メソッドが呼び出されます。オーバーロードでは、異なる署名で代替機能を提供しているだけなので、呼び出し元はそれについて知る必要があります。

または、メソッドを使用する代わりにequals()、コードを少し変更して、ジェネリックで新しい比較メソッドを使用することもできます。ほとんどのコレクションは、ジェネリックでもサポートするように更新されていComparatorますComparable

于 2012-11-25T16:26:16.323 に答える
0

クラスの equals メソッドをオーバーライドする必要があります。メソッドをオーバーライドする場合、メソッドの引数を変更したり、戻り値の型を変更したり、メソッドのアクセシビリティをより制限したりすることはできません。

于 2012-11-25T16:19:25.127 に答える
0

もしそうなら、public boolean equals(MyClass classObject)あなたはオーバーロードしています。したがって、オーバーライド
しないため、メソッドは呼び出されません。そのようなメソッドを作成することもできますが、すべてが適切に機能するために も必要になります (コレクションなど)。
equal(Object)

このような方法に興味を持つ唯一の理由は、パフォーマンスのためです。しかし、最近では使用に問題があるとは思いませんequals(Object)

于 2012-11-25T16:17:51.257 に答える