两个类相互包含

时间:2012-06-02 07:46:29

标签: java class

我在java中有两个类:X和Y.Y是X的成员,X的列表是Y的成员。
我需要确保它们始终匹配,例如,如果x有y,那么y的列表应该包含x 最好的方法是什么?应该将setY(y)和addX(x)相互引用吗?

3 个答案:

答案 0 :(得分:2)

根据你的意见,我理解的是:

  • 您有Camp个对象,其中包含List<Child>
  • 您有Child个对象,其中包含Camp

您希望确保如果某些List<Child>中的Camp 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方法。如果你想确保没有没有营地的孩子,我认为这适合你的情况。

答案 1 :(得分: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的评论之后,我意识到,这不是一件好事,而且可以很容易地使用。我编辑了一些例外而不是删除我的答案。

答案 2 :(得分: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;
  }
}

关于如何实现这一点的草图。它听起来很像一棵树,所有节点都知道父母。