para ilustrar el concepto con un ejemplo rápido (en bruto), considere lo siguiente:
public interface ChangeHandler {
public void handleChange();
}
public class FileMonitor {
private File file;
private Set<ChangeHandler> handlers = new HashSet<ChangeHandler>();
public FileMonitor(File file) {
this.file = file;
}
public void registerChangeHandler(ChangeHandler handler) {
this.handlers.add(handler);
}
public void unregisterChangeHandler(ChangeHandler handler) {
this.handlers.remove(handler);
}
...
}
Si una clase de cliente utiliza esta API FileMonitor
, que podrían hacer esto:
public class MyClass {
File myFile = new File(...);
FileMonitor monitor = new FileMonitor(myFile);
public void something() {
...
ChangeHandler myHandler = getChangeHandler();
monitor.registerChangeHandler(myHandler);
...
}
}
Si el autor del MyClass
luego se olvida de llamar al unregisterChangeHandler()
cuando se hace con el controlador, FileMonitor
HashSet
referenciará para siempre la instancia que se registró, causando que permanezca en la memoria hasta el FileMonitor
se destruye o la aplicación se cierra.
Para evitar esto, Bloch sugiere utilizar una colección de referencia débil en lugar del HashSet
, de modo que si se destruye su instancia de MyClass
, la referencia se eliminará de la colección del monitor.
Es posible reemplazar el HashSet
en FileMonitor
con un WeakHashMap
y utilizar los manipuladores como las claves, ya que este último se eliminará automáticamente el controlador de la colección cuando todas las demás referencias al objeto se han ido.
me gustaría tener en cuenta que el enlace está roto – Maurice
fijo, gracias por señalar esto. –
Wow ardiente rápido! gracias – Maurice