У меня есть следующие классы.
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();
}
}
Как ясно видно, существует круговая зависимость между классами.если я попытаюсь запустить класс А, я в итоге получу StackOverflowError
.
Если создается граф зависимостей, где узлами являются классы, то эту зависимость можно легко идентифицировать (по крайней мере, для графов с небольшим количеством узлов).Тогда почему JVM не идентифицирует это, по крайней мере, во время выполнения?Вместо броска StackOverflowError
JVM может по крайней мере дать предупреждение перед началом выполнения.
[Обновить] Некоторые языки не могут иметь циклические зависимости, потому что тогда исходный код не будет собираться.Например, см. Этот вопрос и принятый ответ.Если циклическая зависимость является запахом дизайна для C #, то почему она не для Java?Только потому, что Java может (компилировать код с круговыми зависимостями)?
[update2] Недавно найден jCarder .Согласно веб-сайту, он обнаруживает потенциальные тупики, динамически инструментируя байтовые коды Java и просматривая циклы в графе объектов.Кто-нибудь может объяснить, как инструмент находит циклы?