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中也是通過依賴注入的方法來解決類的相互依賴問題。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM