使用self(this)-parameter在构造函数中调用构造函数

时间:2013-08-26 15:57:55

标签: java parameters constructor this

我需要将类型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?有什么建议吗?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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,因为部分初始化的引用被复制到构造函数。此代码编译是因为编译器在代码中找不到任何缺失,因为所有适当的引用和变量都存在。