2

我在java中有两个类:X和Y。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,例如child,则child.getCamp()必须是camp(反之亦然?)。

在我看来,如果这需要严格执行,你应该ChildCamp. 您可以创建一个工厂方法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 回答