У меня есть следующие классы.
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 может (компилировать код с циклическими зависимостями)?
[update2] Недавно найден jCarder . Согласно веб-сайту, он обнаруживает потенциальные тупики, динамически инструментируя байтовые коды Java и просматривая циклы в графе объектов. Кто-нибудь может объяснить, как инструмент находит циклы?