Ho le seguenti classi.Dipendenza circolare nelle classi java
public class B
{
public A a;
public B()
{
a= new A();
System.out.println("Creating B");
}
}
e
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();
}
}
Come si vede chiaramente, v'è una dipendenza circolare tra le classi. se provo a eseguire la classe A, alla fine ottengo uno StackOverflowError
.
Se viene creato un grafico di dipendenza, in cui i nodi sono classi, questa dipendenza può essere facilmente identificata (almeno per i grafici con pochi nodi). Allora perché la JVM non lo identifica, almeno in fase di runtime? Invece di lanciare StackOverflowError
, JVM può almeno dare un avvertimento prima di iniziare l'esecuzione.
[Aggiornamento] Alcune lingue non possono avere dipendenze circolari, perché quindi il codice sorgente non verrà generato. Ad esempio, see this question e la risposta accettata. Se la dipendenza circolare è un odore di progettazione per C# allora perché non è per Java? Solo perché Java può (compilare codice con dipendenze circolari)?
[update2] Trovato di recente jCarder. Secondo il sito web, trova potenziali deadlock, strumentando dinamicamente i codici byte Java e cercando i cicli nel grafico degli oggetti. Qualcuno può spiegare in che modo lo strumento trova i cicli?
Perché si aspetta di ottenere un avvertimento su questo? Hai letto da qualche parte che JVM farà questo per te? – Cratylus
Il tipo di problema è molto semplice per lo sviluppatore da rilevare e prima. La JVM tende ad avvertire problemi di attacco che non è possibile rilevare facilmente, come un file di classe corrotto. –
Mi piace come solo 2 delle 5 risposte (al momento in cui scrivo questo) rispondono veramente alla tua domanda: "perché il compilatore non rileva e avvisa del potenziale problema?". E nessuno di questi due è il più votato (di nuovo, almeno nel momento in cui scrivo questo). –