我需要将类型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?有什么建议吗?
答案 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
,因为部分初始化的引用被复制到构造函数。此代码编译是因为编译器在代码中找不到任何缺失,因为所有适当的引用和变量都存在。