设为首页 加入收藏

TOP

Java循环依赖
2018-01-02 06:06:34 】 浏览:111
Tags:Java 循环 依赖

最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢?


示例代码1


public class  Test{
    public static void main(String[] args) {
        B testb = new B();
    }
}
 
class A{
    public B b;
    public A (){
        b = new B();
    }
    public void printB(){
        System.out.println("Ab");
        b.printA();
    }
   
    public void printA(){
        System.out.println("AA");
    }
   }
 
class B{
    public A a;
    public B (){
        a = new A();
    }
    public void printB(){
        System.out.println("BB");
        a.printA();
    }
   
    public void printA(){
        a.printA();
    }
   }


可以看到A类的构造方法中,new了一个B的对象,同时B类的构造方法中,new了一个A的对象。


如果此时我们运行该类的话,会报如下错误:


Exception in thread "main" java.lang.StackOverflowError


问题出现的原因在于A类和B类之间出现了循环依赖。


那么是否有方法可以解决这个问题呢?答案是:有


示例代码2:


public class  Test{
    public static void main(String[] args) {
        A testa = new A();
        B testb = new B();
        testa.b = testb;
        testb.a = testa;
        testa.printB();
        testb.printA();
        testa.print();
        testb.print();
    }
}
 
class A{
    public B b;
    public void printB(){
        b.printB();
    }
   
    public void printA(){
        System.out.println("AA");
    }
   
    public void print(){
        b.printA();
    }
    }
class B{
    public A a;
    public void printB(){     
        System.out.println("BB");
    }
   
    public void printA(){
        a.printA();
    }
    public void print(){
        a.printB();
    }
    }


运行代码2,运行结果为:


BB


AA


AA


BB


在示例代码2中,testa和testb创建时调用的是类A和类B的默认构造方法,创建了类A和类B的实例。


然后将B的实例注入到类A中。testa.b = testb;


将A的实例注入到类B中。testb.a = testa;


testa.print()调用b.printA();b.printA()调用a.printA();a.printA()显示结果为AA


我们通过属性注入的方法,使得类A和类B不在出现示例代码1中的错误,并且使得两个相互依赖的类A和B可以调用相互依赖的方法。


事实上,spring中也是通过依赖注入的方法来解决类的相互依赖问题。



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java并发编程之ThreadLocal源码分.. 下一篇多线程CountDownLatch和Join

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

最新文章

热门文章

C 语言

C++基础

windows编程基础

linux编程基础

C/C++面试题目