Круговая зависимость в классах Java

У меня есть следующие классы.

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 и просматривая циклы в графе объектов. Кто-нибудь может объяснить, как инструмент находит циклы?

33
задан Community 23 May 2017 в 12:02
поделиться