Tengo las siguientes clases.Dependencia circular en clases Java
public class B
{
public A a;
public B()
{
a= new A();
System.out.println("Creating B");
}
}
y
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();
}
}
Como puede verse claramente, hay una dependencia circular entre las clases. si trato de ejecutar la clase A, eventualmente obtengo un StackOverflowError
.
Si se crea un gráfico de dependencia, donde los nodos son clases, entonces esta dependencia se puede identificar fácilmente (al menos para gráficos con pocos nodos). Entonces, ¿por qué la JVM no identifica esto, al menos en tiempo de ejecución? En lugar de arrojar StackOverflowError
, JVM puede al menos dar una advertencia antes de comenzar la ejecución.
[Actualización] Algunos idiomas no pueden tener dependencias circulares, porque entonces el código fuente no se compilará. Por ejemplo, see this question y la respuesta aceptada. Si la dependencia circular es un olor de diseño para C#, entonces ¿por qué no es para Java? Solo porque Java puede (compilar código con dependencias circulares)?
[actualización2] Recientemente encontrado jCarder. Según el sitio web, encuentra bloqueos potenciales instrumentando dinámicamente los códigos de bytes de Java y buscando ciclos en el gráfico de objetos. ¿Alguien puede explicar cómo encuentra la herramienta los ciclos?
¿Por qué se puede esperar para obtener una advertencia sobre esto? ¿Leyó en alguna parte que JVM hará esto por usted? – Cratylus
El tipo de problema es muy fácil de detectar para el desarrollador y primero. La JVM tiende a advertir problemas que no se pueden detectar fácilmente, como un archivo de clase corrupto. –
Me encanta cómo solo 2 de las 5 respuestas (a la hora de escribir esto) realmente responden a su pregunta: '¿por qué el compilador no detecta y advierte sobre el posible problema? Y ninguno de esos 2 es el más votado (nuevamente, al menos en el momento en que escribo esto). –