Java类中的循环依赖

我有以下课程。

public class B 

{

public A a;

public B()

{

a= new A();

System.out.println("Creating B");

}

}

public class A 

{

public B b;

public A()

{

b = new B();

System.out.println("Creating A");

}

public static void main(String[] args)

{

A a = new A();

}

}

可以清楚地看到,这些类之间存在循环依赖关系。如果尝试运行A类,最终会得到StackOverflowError

如果创建了一个依赖图,其中节点是类,则可以轻松地识别这种依赖关系(至少对于节点很少的图)。那么,为什么JVM至少在运行时无法识别此身份?StackOverflowErrorJVM至少可以在开始执行之前发出警告,而不是抛出。

某些语言不能具有循环依赖关系,因为这样就无法构建源代码。和可接受的答案。如果循环依赖性是C#的设计味道,那么为什么Java不这样呢?仅因为Java可以(编译具有循环依赖项的代码)?

最近找到了jCarder。根据该网站,它通过动态检测Java字节代码并在对象图中查找循环来发现潜在的死锁。谁能解释该工具如何找到周期?

回答:

您的类A的构造函数调用类B的构造函数。类B的构造函数调用类A的构造函数。您有一个无限递归调用,这就是为什么最终有一个。

Java支持类之间具有循环依赖关系,这里的问题仅与构造函数相互调用有关。

您可以尝试以下方法:

A a = new A();

B b = new B();

a.setB(b);

b.setA(a);

以上是 Java类中的循环依赖 的全部内容, 来源链接: utcz.com/qa/424212.html

回到顶部