2017-12-18 19 views
1

私は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でも同じです。これは明らかに無限に再帰的であるため、変更する必要があります。私の質問は、これを避ける方法はありますか?そうでない場合は、どちらを無視するかをどのように選択する必要がありますか?

+3

あなたは 'Bar'で' Foo'のインスタンスを必要とする理由私は本当に疑問です。 –

+0

現代のIDEはあなたのために 'equals'メソッドと' hashcode'メソッドを生成できなければなりません。そうすれば、IDEは考えさせることができます。インテリジェントIDEAは、完全に実装されたためにこれらを生成することができます。 –

+0

循環依存関係があるという問題。これを削除すると、実装を書くことができます。 –

答えて

1

equals()ための最も簡単な解決策は、最初のアイデンティティを比較することにより、短絡にある:

public boolean equals(Object o) { 
    if (o == this) { 
     return true; 
    } 
    // check type and fields etc. 
} 
+0

しかし、hashCodeはどうですか?あなたは本当に他のものなしで1つを持つことはできません。 –

+0

@OliverCharlesworth真実ですが、もっと具体的な例がなくてもそれを解決するのは難しいです。それが示すように、どちらのクラスも意味のあるフィールドを含んでいません。 – shmosel

関連する問題