你好,游客 登录 注册 搜索
背景:
阅读新闻

Java循环依赖

[日期:2018-01-01] 来源:Linux社区  作者:cfyrwang [字体: ]

最近看到一个问题:如果有两个类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中也是通过依赖注入的方法来解决类的相互依赖问题。

本文永久更新链接地址http://www.linuxidc.com/Linux/2018-01/149995.htm

linux
相关资讯       Java循环依赖  Java循环  Java依赖 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款