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 至少在运行时没有识别这一点呢?而不是抛出,JVM至少可以在开始执行之前给出一个警告。StackOverflowError
[更新]某些语言不能具有循环依赖项,因为这样就不会生成源代码。例如,请参阅此问题和接受的答案。如果循环依赖关系是C#的设计气味,那么为什么它不适用于Java呢?只是因为Java可以(编译具有循环依赖关系的代码)?
[更新2]最近发现的jCarder。根据该网站的说法,它通过动态检测Java字节代码并在对象图中查找周期来发现潜在的死锁。谁能解释一下该工具如何找到周期?