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中也是通过依赖注入的方法来解决类的相互依赖问题。

      

  • 相关阅读:
    SAP BDC批量导入数据(转)
    如何快速从BSEG读取数据(转)
    刷新ALV定位到当前记录行
    一些常用的系统变量(SYST)
    javascript实例
    selenium webDriver属性
    获取豆瓣电影数据
    新浪微博超话题签到demo
    java读取XML文件的四种方法总结(必看篇)
    StringReader分析
  • 原文地址:https://www.cnblogs.com/cfyrwang/p/6421657.html
Copyright © 2011-2022 走看看