zoukankan      html  css  js  c++  java
  • 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中也是通过依赖注入的方法来解决类的相互依赖问题。

      

  • 相关阅读:
    Ionic2 开发笔记(1)ionic2 +angular2搭建
    git随笔(常用命令归纳)
    Ionic2开发笔记(2)创建子页面及其应用
    移动开发规范
    OnsenUI和AngularJS配合搭建混合应用基本步骤(Cordova安装与创建平台项目等)(一)
    解决Andriod软键盘出现把原来的布局给顶上去的方法(转)
    Android BroadCast 基础知识
    Andriod Service 基础知识
    Android--双击退出程序
    Android---自动启动方法
  • 原文地址:https://www.cnblogs.com/cfyrwang/p/6421657.html
Copyright © 2011-2022 走看看