解决构造函数导致的循环依赖

假设有下面三个类:

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);
posted @ 2021-02-16 17:07  baiyuxuan  阅读(43)  评论(0编辑  收藏  举报