zoukankan      html  css  js  c++  java
  • 解决构造函数导致的循环依赖

    假设有下面三个类:

    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);
    
  • 相关阅读:
    MySQL 大表优化方案
    mysql千万级大数据SQL查询优化
    mysql binlog格式
    MySQL误操作后如何快速恢复数据
    mysql数据库优化
    查看MYSQL数据库中所有用户及拥有权限
    MySQL如何优化
    MySQL 开发实践
    show slave各项参数解释
    MYSQL主从数据库搭建
  • 原文地址:https://www.cnblogs.com/baiyuxuan/p/14406984.html
Copyright © 2011-2022 走看看