0

问题:

是否存在需要使用双向一对一合成的情况(在现实生活中)?什么时候?表示 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);
    }
}

PS如果在某些情况下确实需要它,请告诉它有什么优点和缺点。

4

2 回答 2

2

尽管这是一个相当常见的结构,但正如您正确指出的那样,存在许多固有的不稳定性,尤其是如何整齐地破坏结构的问题。

最常见的避免策略是将两个对象包装在一个处理程序中。

public class C {
  private A a;
  private B b;

  public A getA () {
    return a;
  }

  public B getB () {
    return b;
  }

}
于 2013-11-11T10:32:50.047 回答
1

这是一个很常见的情况。

想象一下,如果这对夫妇结婚了,那么一个班级HusbandWife彼此之间有一个引用。

优点是来自或类或其他你有对另一个的引用。您代表对象之间的所有关系,它使通过它们的导航更容易。

缺点通常是维持这些关系。由于每个关系都有两个端点,因此如果关系发生变化,您必须维护两个端点。

发生这种情况的一个很好的常见情况是链表,它同时引用了前一个元素和下一个元素。

于 2013-11-11T10:18:20.607 回答