的问题: 的
当您需要使用双向一对一合成时,它是否存在(在现实生活中)?何时?意味着A引用了B,而B引用了同一个A对象。
的代码: 的
我如何理解:
public class A {
int val;
private B b = new B(this);
public A() {
this.val = 10;
}
public void getAVal() {
System.out.println("A val = " + val);
}
public void getBVal() {
this.b.f();
}
public static void main(String[] args) {
A a = new A();
a.getAVal(); // echo 10
a.getBVal(); // echo 0
}
}
public class B {
private A a;
private int val;
public B(A a) {
this.a = a;
this.val = a.val; //WRONG! A isn't constructed yet
}
public void f() {
System.out.println("B val = " + this.val);
}
}
P.S。 如果在某些情况下确实需要它,请告诉它有什么促销和利弊。
答案 0 :(得分:2)
虽然这是一个相当常见的结构,但正如你正确指出的那样,存在许多固有的不稳定性,其中最重要的是如何整齐地破坏结构。
最常用的避免策略是将两个对象包装在处理程序中。
public class C {
private A a;
private B b;
public A getA () {
return a;
}
public B getB () {
return b;
}
}
答案 1 :(得分:1)
这是一个非常常见的案例。
想象一下,例如,如果这对夫妻结婚,则Husband
和Wife
会互相引用。
专业人士是来自或上课或其他你引用另一个人。您可以表示对象之间的所有关系,它可以更轻松地导航它们。
缺点通常是维持这些关系。由于每个关系都有两个端点,因此如果关系发生变化,则必须维护两个端点。
发生这种情况的一个很好的常见情况是 double 链接列表,它引用了前一个和下一个元素。