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