我在java中有两个类:X和Y.Y是X的成员,X的列表是Y的成员。
我需要确保它们始终匹配,例如,如果x有y,那么y的列表应该包含x
最好的方法是什么?应该将setY(y)和addX(x)相互引用吗?
答案 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;
}
}
关于如何实现这一点的草图。它听起来很像一棵树,所有节点都知道父母。