¿Cómo se pueden evitar las dependencias circulares cuando se diseñan dos clases con una relación productor/consumidor? Aquí ListenerImpl necesita una referencia a Broadcaster para registrarse/anular el registro, y Broadcaster necesita una referencia de vuelta a los Listeners para enviar mensajes. Este ejemplo está en Java, pero puede aplicarse a cualquier lenguaje OO.¿Cómo se pueden evitar las dependencias circulares cuando se utilizan devoluciones de llamada?
public interface Listener {
void callBack(Object arg);
}
public class ListenerImpl implements Listener {
public ListenerImpl(Broadcaster b) { b.register(this); }
public void callBack(Object arg) { ... }
public void shutDown() { b.unregister(this); }
}
public class Broadcaster {
private final List listeners = new ArrayList();
public void register(Listener lis) { listeners.add(lis); }
public void unregister(Listener lis) {listeners.remove(lis); }
public void broadcast(Object arg) { for (Listener lis : listeners) { lis.callBack(arg); } }
}
Pero todavía hay un ciclo de referencia - radiodifusor tenga una referencia al objeto concreto ListenerImpl aunque el tipo de la referencia sea el tipo de interfaz de Listener. ¿No implica un ciclo de referencia un ciclo de dependencia? –
No hay realmente una manera de eliminar un ciclo de referencia. Es algo necesario para este tipo de cosas. Los ciclos de referencia no son realmente un problema en estos días, dado que cualquier buen recolector de basura debería manejarlos bien. Son ciclos de dependencia de los que debe preocuparse. – Herms
@sk: para definir 'ciclo' primero debe definir 'dependencia': no hay ciclo de tiempo de compilación. Existe un ciclo de ejecución si todas las referencias son iguales, y alguien necesita interrumpir el ciclo cuando ya no es necesario (eliminar oyentes) – xtofl