-1

これは良い考えでしょうか?今日では、そうでない場合、どのように解決できますか?

追加するのは面白いと思います

final boolean identical(Obj obj){
   return (this==obj);
}

したがって、同等が改善されました(論理的同等)

boolean equals (Obj obj){
   return identical(obj); // by default, but its overrideable
}

この質問は、この別の質問(コレクション内のオブジェクトに異なる等しい(物理的な等しいと論理的な等しい)を持つためのメカニズム)で、同一のポインターのリストを等しいオブジェクトのリストと比較する方法を持つ必要性から生じました。そのアイデアで、コレクションインターフェイスに追加できます。

 coll.equals(coll2)
 coll.identical(coll2)
 coll.identicalElem(coll2){
      //current equals implementation of collections but calling identical to compare objects
 }

どう思いますか?

4

4 に答える 4

2

これを知っているかどうかはわかりませんが、標準のJavaAPIにはすでにIdentityHashMapがあります。また、System.identityHashCodeを使用してオブジェクトのハッシュコードを生成できます。

于 2012-08-01T11:54:32.260 に答える
2

投稿したデフォルトのequals()実装は、すでにの実装ですjava.lang.Object。同じ実装でオーバーライドしても意味がありません。

コレクションインターフェイスに追加する3つの方法について:

coll.equals(coll2):これはすでにコレクションインターフェイスにあります。

coll.identical(coll2):と同等ですがcoll == coll2、読みにくくなります。そのような方法のポイントはわかりません。

coll.identicalElem(coll2):このメソッドは確かに存在しませんが、私はそのようなメソッドを必要としたことがないので、CollectionのAPIを乱雑にするべきではないと思います。これを行うには、Guavaの同等性を使用できます。

Equivalence.identity().pairWise().equivalent(coll1, coll2);
于 2012-08-01T12:03:12.137 に答える
0

オブジェクトの既存の「equals」メソッドはすでにこれを行っています-そうですか?

コードは次のとおりです。

    public boolean equals(Object obj) {
        return (this == obj);
    }

したがって、「equals」の実装を提供すると、それが実行されます。そうでない場合(デフォルトでは)、「==」を使用します。

于 2012-08-01T11:56:08.343 に答える
0

equals(Object)クラスの2つのインスタンスが等しいかどうかをテストするので、同じインスタンスを表すかどうか(つまり、ポインターが等しいかどうか)ではないため、お勧めできません。

その「改善された」equalsメソッドを実装すると、次のような結果 new Rectangle(1, 2).equals(new Rectangle(1, 2))になります。falseを返す、これはばかげているでしょう。

さらに、equalsメソッドの現在の定義に依存する大量のコードがあります(たとえば、HashMapsは、同じではないオブジェクトのハッシュコードの競合を解決するためにそれを使用します)。特別な理由もなく、物事はあちこちで爆発するでしょう。

提案する方法でも、既存の演算子identicalに値を追加することはありません。==

equals私の意見では、それが理にかなっているオブジェクトのメソッドをオーバーライドします(私はそれを疑問視していますが)が、トップレベルでの変更とすべてのオブジェクトのデフォルトの動作を提案したくないことは間違いありません。

于 2012-08-01T11:58:48.157 に答える