Java:bidiretional组合示例

时间:2013-11-11 10:10:20

标签: java oop

问题:

当您需要使用双向一对一合成时,它是否存在(在现实生活中)?何时?意味着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。 如果在某些情况下确实需要它,请告诉它有什么促销和利弊。

2 个答案:

答案 0 :(得分:2)

虽然这是一个相当常见的结构,但正如你正确指出的那样,存在许多固有的不稳定性,其中最重要的是如何整齐地破坏结构。

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

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

  public A getA () {
    return a;
  }

  public B getB () {
    return b;
  }

}

答案 1 :(得分:1)

这是一个非常常见的案例。

想象一下,例如,如果这对夫妻结婚,则HusbandWife会互相引用。

专业人士是来自或上课或其他你引用另一个人。您可以表示对象之间的所有关系,它可以更轻松地导航它们。

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

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