2

Java には X と Y の 2 つのクラスがあります。Y は X のメンバーであり、X のリストは Y のメンバーです。
たとえば、x に y がある場合、y のリストには x が含まれている必要があります。
それを行う最良の方法は何ですか?setY(y) と addX(x) は互いに参照する必要がありますか?

4

3 に答える 3

2

あなたのコメントを見ると、私が理解しているのは次のことです。

  • Camp含むオブジェクトがありますList<Child>
  • Child含むオブジェクトがありますCamp

List<Child>in someCamp campに特定の がある場合Child、たとえばがあることを確認する必要があります(逆の場合も同様です)。childchild.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 に答える