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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值