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至少在运行时无法识别此身份?StackOverflowError
JVM至少可以在开始执行之前发出警告,而不是抛出。
某些语言不能具有循环依赖关系,因为这样就无法构建源代码。和可接受的答案。如果循环依赖性是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