2011-03-30 24 views
8

¡Me pregunto si alguien puede aconsejar sobre cualquier buena manera de romper una dependencia circular entre 2 clases en Java! FindBugs propone el uso de interfaces, así que me pregunto si alguien tiene alguna buena experiencia con este tipo de problema.Tratando con una dependencia circular

¡Gracias de antemano!

+1

¿Qué hay de malo con las referencias circulares en primer lugar? ¿Por qué querrías romperlos? Tal vez deberías señalar esto en tu pregunta. – Mecki

+1

bueno, no sé ... ¡suponiendo que sea un antipatrón que quiero evitar! y con fines educativos, para verificar diferentes posibilidades de diseño.! – tropicana

+0

¿Los ref circulares son un antipatrón? ¿Dice quién? El GC de Java no tiene ningún problema con ellos para las instancias (solo un GC que usa recuento de referencia puro tendría tal problema) y el compilador no tiene ningún problema con ellos en tiempo de compilación, aparte de que debe compilar ambas clases al mismo tiempo, para que el compilador pueda resolver las dependencias. Por cierto, te perdiste una etiqueta importante: java. Arreglaré las etiquetas para ti. – Mecki

Respuesta

5
+0

Downvoter-- ¿por qué? – andersoj

+0

Probablemente debido al contexto faltante alrededor de sus URL enlazadas. Las URL se recomiendan para lecturas adicionales, pero la respuesta debe contener algún contexto y la esencia de las URL. Consulte esto: http://stackoverflow.com/help/how-to-answer (Proporcione el contexto para los enlaces) – sceiler

2

Hay una entrada en el blog here sobre cómo se utilizó Restructure101 para eliminar dependencias cíclicas, "nudos", de Junit y una presentation del Lausanne jarra en la forma en que se utiliza para eliminar los enredos de Icefaces.

En cuanto al debate sobre si las dependencias cíclicas son malas, sugiero leer el Solid Principles de Uncle Bob.

Descargo de responsabilidad: Trabajo para Headway Software los desarrolladores de Restructure101.

6

Las dependencias circulares no siempre se deben evitar. Los evitaría en general, pero los mantengo en pequeños rincones de un sistema. En general, es decir, si la capa de acceso a datos y la capa de representación de la aplicación J2EE dependen de la circular, diría que es algo malo, porque significa que todo debe compilarse de una sola vez y que las pruebas son una pesadilla. Pero no hay problema si una lista de estructura de datos y su tipo de iterador son dependientes de forma circular.

Como Findbugs sugiere utilizar interfaces para romper una dependencia circular. Es decir, introducir una interfaz para al menos un tipo del círculo y hacer que las otras clases utilicen la interfaz en todas partes. ¿Necesitas un código de ejemplo?

+0

+1. Las buenas metodologías de diseño son buenas en virtud de tener un claro beneficio. En la circunstancia específica de una colección y su iterador (flojo), por ejemplo, introducir una nueva interfaz simplemente para romper el ciclo es excesivo. Sin embargo, yo diría esto: solo use dependencias circulares en circunstancias donde puede incluir todas las dependencias, excepto una, como clases internas o anidadas. De hecho, al usar las clases internas de esta manera, puede evitar muchas alertas de dependencia circular, al usar la referencia de contenedor implícita que guarda la clase interna. –

+0

Al utilizar la referencia implícita de las clases internas, es posible que evite la advertencia de herramientas, pero su código todavía tiene referencias circulares. Pero como dije, aconsejo que los círculos sean lo más pequeños posible, no para evitarlos a toda costa. Y al usar clases internas haces eso. – jmg