最近看到一个问题:如果有两个类A和B,A类中有一个B的对象b,B类中有一个A的对象a,那么如何解决这两个类的相互依赖关系呢?
示例代码1
1234567891011121314151617181920212223242526272829303132333435 | 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:
12345678910111213141516171819202122232425262728293031323334353637383940 | 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中也是通过依赖注入的方法来解决类的相互依赖问题。
新闻热点
疑难解答