Java 使用self(this)-参数调用构造函数中的构造函数

Java 使用self(this)-参数调用构造函数中的构造函数,java,parameters,constructor,this,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

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

确实有效。它的问题在于它在对象完全初始化之前就公开了对象(例如,如果
B
构造函数调用参数上的方法,这可能是一件坏事),但它确实起作用。引用
B.a
将引用已经/正在构造的
a
实例


我建议尽可能避免循环引用,但如果替代方法更糟糕,则您给出的代码将起作用。

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

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
,因为部分初始化的引用被复制到构造函数。这段代码之所以能够编译,是因为编译器没有发现代码中缺少的任何东西,因为所有适当的引用和变量都在那里。

您必须学习依赖项注入原则,它是spring框架的核心,是解决这些类型问题的原则。您具体想做什么?考虑到项目细节可能会影响不同的答案,您可能只需要使用set方法即可。我不确定在构造函数中你是如何做到这一点的。在这种情况下,我们不能考虑使用依赖注入吗?@算法:如果这两个字段实际上是<代码>最终< /代码>,依赖注入实际上没多大用处。在两个相互引用的对象中得到两个最终字段的唯一方法就是使用这样的东西。我们这里没有足够的上下文来评论备选方案。@JonSkeet类A是一个图形类。有数据结构和方法来处理图形(添加和删除边,等等)。类B是一个度序列类,具有计算度序列、调整度序列等方法。在我的模型中,每个图形对象都应该有一个度序列对象,其中图形本身应该是最终的。我不知道依赖对象将如何工作,因为度序列可以在生成图形时首先计算,度序列应该在创建图形后生成。@user2653076:如果字段是非最终字段,您可以在两个对象都构造好之后设置其中一个对象,但是如果您想要循环依赖关系,只要您在构造函数中小心,就可以了。