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

      

  • 相关阅读:
    python中selenium+unittest实操
    python+selenium元素定位04——浏览器多窗口处理
    python+selenium元素定位03——自动化常见场景处理
    python+selenium元素定位02——层级定位
    requests.post() 方法的使用
    python+selenium元素定位01——显式、隐式等待
    python+selenium之元素识别二
    IO流常用基类
    STS中导入Jmeter源码遇到的坑
    MySql处理日期时间常用函数
  • 原文地址:https://www.cnblogs.com/cfyrwang/p/6421657.html
Copyright © 2020-2023  润新知