1. 程式人生 > 其它 >解決建構函式導致的迴圈依賴

解決建構函式導致的迴圈依賴

技術標籤:Java技巧Javajava

假設有下面三個類:

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建立物件,這個例子揭示了一種由建構函式導致的迴圈依賴問題。ABC三個類之間通過建構函式引數產生了迴圈依賴,由於每個類都要求在建構函式中傳入已初始化的其它物件,這就導致無法為這三個類中的任一個類建立物件。

解決方案也很簡單,只需把屬性賦值推遲到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);