我在java中有两个类:X和Y。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 回答