假设有下面三个类:
public class A
{
private B b;
public A(B b) { this.b = b; }
...
}
public class B
{
private C c;
public B(C c) { this.c = c; }
...
}
public class C
{
private A a;
public C(A a) { this.a = a; }
...
}
那么问题来了,该如何创建一个A
的对象呢?
A a = new A(new B(new C(new A(...))); // WTF ???
我们发现,无法为A
创建对象,这个例子揭示了一种由构造函数导致的循环依赖问题。A
、B
、C
三个类之间通过构造函数参数产生了循环依赖,由于每个类都要求在构造函数中传入已初始化的其它对象,这就导致无法为这三个类中的任一个类创建对象。
解决方案也很简单,只需把属性赋值推迟到setter函数:
public class A
{
private B b;
public void setB(B b) { this.b = b; }
...
}
public class B
{
private C c;
public void setC(C c) { this.c = c; }
...
}
public class C
{
private A a;
public void setA(A a) { this.a = a; }
...
}
然后就可以像下面这样创建对象:
A a = new A();
B b = new B();
C c = new C();
a.setB(b);
b.setC(c);
c.setA(a);