У меня следующие занятия.
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 и ища циклы в графе объектов. Может ли кто-нибудь объяснить, как инструмент находит циклы?
why doesn't the compiler detect and warn about the potential issue. И ни один из этих двух не получил наибольшего количества голосов (опять же, по крайней мере, в то время, когда я это пишу). - person Bert F   schedule 05.09.2010