码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-02-18 13:32:53      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:例子   问题   private   lan   参数   setter   his   etc   其它   

假设有下面三个类:

public class A
{
    private B b;
    public A(B b) { this.b = b; }
    ...
}

public class B
{
    private C c;
    public B(C b) { 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);

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

标签:例子   问题   private   lan   参数   setter   his   etc   其它   

原文地址:https://www.cnblogs.com/baiyuxuan/p/14406984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!