解決建構函式導致的迴圈依賴
阿新 • • 發佈:2021-02-17
假設有下面三個類:
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);