【发布时间】:2011-04-08 10:46:24
【问题描述】:
我有以下课程。
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。
[更新] 一些语言不能有循环依赖,因为那样的话源代码将无法构建。例如,see this question 和接受的答案。如果循环依赖是 C# 的一种设计味道,那么为什么它不是 Java 的呢?只是因为Java可以(编译循环依赖的代码)?
[update2] 最近发现jCarder。根据该网站,它通过动态检测 Java 字节码并在对象图中查找循环来发现潜在的死锁。谁能解释一下该工具是如何找到循环的?
【问题讨论】:
-
您为什么会收到警告?您是否在某处读到 JVM 会为您执行此操作?
-
这类问题对于开发人员来说很容易检测到,并且首先。 JVM 倾向于警告您无法轻易检测到的问题,例如损坏的类文件。
-
我喜欢 5 个答案中只有 2 个(截至我写这篇文章的时候)真正回答你的问题:
why doesn't the compiler detect and warn about the potential issue。这两个都不是投票最高的(同样,至少在我写这篇文章的时候)。 -
@BertF:七年后,仍然如此。
-
那么谁选择了接受的答案?
标签: java constructor circular-dependency