Me gustaría implementar el patrón MVC en una situación difícil. La dificultad es que mis Modelos (las entidades que generan los eventos) son de larga duración, mientras que las Vistas (los receptores de los eventos) son de corta duración. Mi problema es que a través de la conexión entre los dos, los Modelos de larga vida mantienen vivas mis visiones efímeras, es decir, no pueden recogerse basura.Cómo implementar el patrón MVC sin mantener Vistas activas
[MODEL] ------- <weak> -------> [VIEW]
|
<strong>
|
v
[CONTROLLER]
Una forma de evitar esto es para almacenar las conexiones en el modelo en un WeakHashMap < Vista, Controlador >. Esto esencialmente permite que la Vista sea basura, y cuando eso sucede, WeakHashMap arrojará el Controlador correspondiente también. Es decir, si el controlador no contiene una referencia (fuerte) a la vista, lo que generalmente hace. En este caso, las Vistas se mantienen activas a través de las referencias fuertes hasta que el Modelo sale del alcance.
[MODEL] ------- <weak> -------> [VIEW]
| ^
<strong> |
| |
v |
[CONTROLLER] ----------- <strong> ---/
¿Hay otra manera de unir a los oyentes a mis modelos que no va a mantener mis puntos de vista (y controladores) vivo?
ACTUALIZACIÓN: Para responder la pregunta de mdma: el controlador mantiene una referencia a la vista, porque necesita actualizar la vista. Esta referencia puede ser débil, pero me gustaría que los Controladores sean clases internas anónimas de la clase Vista, en cuyo caso la instancia del Controlador tiene una referencia fuerte implícita a la instancia de la Vista.
¿Por qué el controlador tiene una fuerte referencia a la vista? – mdma