在Java构造函数中存在循环依赖。

10 浏览
0 Comments

在Java构造函数中存在循环依赖。

我有以下的类。

public class B {

public A a;

public B() {

a= new A();

System.out.println("创建 B");

}

}

public class A {

public B b;

public A() {

b = new B();

System.out.println("创建 A");

}

public static void main(String[] args) {

A a = new A();

}

}

可以明显看出,这些类之间存在循环依赖关系。如果我尝试运行类 A,最终会出现 StackOverflowError 错误。

如果创建一个依赖图,其中节点是类,那么这种循环依赖关系可以很容易地被识别出来(至少对于节点较少的图形而言)。那么为什么 JVM 在运行时不识别这一点呢? JVM 在开始执行之前,至少可以在抛出 StackOverflowError 错误之前给出警告。

[更新] 有些语言不能有循环依赖关系,因为这样源代码将无法构建。例如,参见这个问题和被接受的回答。如果循环依赖关系是 C# 的设计问题,那么为什么 Java 不是呢?只是因为 Java 可以编译带有循环依赖关系的代码吗?

[更新2] 最近发现了 jCarder。根据网站上的介绍,它通过动态插装 Java 字节码并查找对象图中的循环来发现潜在的死锁。有人可以解释一下这个工具是如何找到循环的吗?

0