Java には X と Y の 2 つのクラスがあります。Y は X のメンバーであり、X のリストは Y のメンバーです。
たとえば、x に y がある場合、y のリストには x が含まれている必要があります。
それを行う最良の方法は何ですか?setY(y) と addX(x) は互いに参照する必要がありますか?
質問する
2789 次
3 に答える
2
あなたのコメントを見ると、私が理解しているのは次のことです。
- を
Camp
含むオブジェクトがありますList<Child>
- を
Child
含むオブジェクトがありますCamp
List<Child>
in someCamp camp
に特定の がある場合Child
、たとえばがあることを確認する必要があります(逆の場合も同様です)。child
child.getCamp()
camp
私の意見では、これを厳密に強制する必要がある場合はChild
、 の内部クラスとして使用する必要がありますCamp
。のファクトリ メソッドaddChild(params reqd to construct child)
を作成できますCamp
が、パブリック コンストラクターはありませんChild
。
public class Camp {
List<Child> children;
public Camp() {
children = new ArrayList<Camp.Child>();
}
public void addChild() {
children.add(new Child(this));
}
class Child {
Camp camp;
private Child(Camp camp) {
this.camp=camp;
}
}
}
構築に必要なその他Child
のパラメーターも addChild メソッドに渡します。キャンプなしで子供がいないことを確認したい場合、これはあなたのケースに適していると思います。
于 2012-06-02T08:18:53.590 に答える
0
class X {
private Y y;
public void setY(Y y) {
if (this.y == y) {
return;
}
// todo: remove this instance from the old 'y'.
this.y = y;
if (this.y != null) {
this.y.addX(this);
}
}
}
// todo: add functionalitiy to remove an X instance.
class Y {
private List<X> xs = new ArrayList<X>();
public X addX(X x) {
if (x != null) {
x.setY(this);
xs.add(x);
}
return x;
}
}
それを実装する方法の大まかなスケッチ。すべてのノードが親を認識しているツリーのように聞こえます。
于 2012-06-02T08:13:50.057 に答える
0
私はこれを理解しました:
public class X{
private Y yMember;
public void setY(Y anY){
//edit next line
if( anY != null && yMember != null ) throw new Exception("already has a parent");
yMember = anY;
}
}
public class Y{
private List<X> xList;
public void addX( X anX ){
//edit next line
if( X.getY() != null ) throw new ArgumentException("x already in a list");
anX.setY(this);
xList.Add(anX);
}
public void removeX( X anX ){
//edit next line
if( X.getY() != this ) throw new ArgumentException("x not in this list");
xList.Remove(anX);
anX.setY(null);
}
}
それはあなたが探しているものですか、それとももっと詳しく説明できますか?
編集: JBNizet からのコメントの後、これは公開するのが本当に良いことではなく、間違って簡単に使用できることに気付きました。回答を削除する代わりに、いくつかの例外を編集しました。
于 2012-06-02T08:04:13.503 に答える