3

我需要将 B 类型的对象链接到 A 类型的任何实例(循环依赖项)。我还可以声明另一个方法,该方法必须在 A 的构造函数之后调用,并将新的 B 链接到 A 实例。我想要实现的是不必手动调用这样的方法。这是示例代码:

public Class A{
    B b;
    public A(){
        b = new B(this); // this does not work,
                         // as this references an object that has not been created yet
    }
}

public Class B{
    A a;
    public B(A a){
        this.a = a; //or something else
    }
}

我评论了有问题的行。我也明白为什么它不能工作。我需要知道的是,是否有一种众所周知的设计模式可以避免这个问题?还是我应该重新设计我的班级模型,将 B 中的任何内容放入 A 中?有什么建议么?

4

2 回答 2

4

确实有效。这是有问题的,因为它在完全初始化之前暴露了一个对象(因此,如果B构造函数调用参数上的方法,例如,这可能是一件坏事),但它确实有效。该引用B.a将是对A已经/正在构造的实例的引用。

我建议尽可能避免循环引用,但如果替代方案更糟,您提供的代码将起作用。

于 2013-08-26T16:00:51.270 回答
1

不推荐使用这种方法,因为对象未完全初始化,可能会创建运行时异常。我们可以采取简单的场景:

public class A {
    B b;
    String s;
    public A(){
        b = new B(this); // this does not work, as this references an object that has not been created yet
        s = "print me";
    }
}


public class B {
    A a;
    public B(A a){
        this.a = a; //or something else
        System.out.println(this.a.s); // will same as a.s;
    }
}

它将输出null,因为部分初始化的引用被复制到构造函数。这段代码可以编译,因为编译器没有发现代码中缺少任何东西,因为所有适当的引用和变量都在那里。

于 2013-08-26T16:20:40.427 回答