私はJavaライブラリを作成していましたが、これと同様の問題が発生しました。クラスFooのオブジェクトは主にクラスBar、他のデータも含まれます。バーオブジェクトは、(注:fooとbarは両方とも不変です)、それを作成したのFooオブジェクトへの参照を含む各種データを格納Java equalsおよびhashCodeメソッドの再帰を回避するにはどうすればよいですか?
class Foo {
private final Bar[] bars;
public Foo(int length) {
this.bars = new Bar[length];
for (int i = 0; i < bars.length; i++) bars[i] = new Bar(this);
}
}
class Bar {
public final Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
}
これはすべてが順調と良いですが、私はequalsメソッドおよびhashCodeメソッドを作成しようとしたとき私は、Foo.barsはFooオブジェクトのアイデンティティーの基本であり、Bar.fooはBarオブジェクトのアイデンティティーの基本であり、Bar.equalsはFoo.equals、Foo.equalsはBar.equals(間接的にjava.util.Arrays.equals)、hashCodeでも同じです。これは明らかに無限に再帰的であるため、変更する必要があります。私の質問は、これを避ける方法はありますか?そうでない場合は、どちらを無視するかをどのように選択する必要がありますか?
あなたは 'Bar'で' Foo'のインスタンスを必要とする理由私は本当に疑問です。 –
現代のIDEはあなたのために 'equals'メソッドと' hashcode'メソッドを生成できなければなりません。そうすれば、IDEは考えさせることができます。インテリジェントIDEAは、完全に実装されたためにこれらを生成することができます。 –
循環依存関係があるという問題。これを削除すると、実装を書くことができます。 –