Pour illustrer le concept avec un exemple rapide (brut), tenez compte des éléments suivants:
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 une classe client utilise alors cette API FileMonitor
, ils pourraient le faire:
public class MyClass {
File myFile = new File(...);
FileMonitor monitor = new FileMonitor(myFile);
public void something() {
...
ChangeHandler myHandler = getChangeHandler();
monitor.registerChangeHandler(myHandler);
...
}
}
Si l'auteur du MyClass
oublie alors d'appeler unregisterChangeHandler()
quand c'est fait avec le gestionnaire, le FileMonitor
HashSet
référencera toujours l'instance qui a été enregistrée, l'amenant à rester en mémoire jusqu'au FileMonitor
est détruit ou l'application se ferme. Pour éviter cela, Bloch suggère d'utiliser une collection de référence faible au lieu du HashSet
, de sorte que si votre instance de MyClass
est détruite, la référence sera supprimée de la collection du moniteur.
Vous pouvez remplacer le HashSet
dans FileMonitor
avec un WeakHashMap
et utiliser les gestionnaires comme les clés, car celui-ci supprime automatiquement le gestionnaire de la collection lorsque sont partis toutes les autres références à l'objet.
Je voudrais simplement noter que le lien est rompu – Maurice
fixe, merci pour le point cela. –
Wow flamboyant rapidement! merci – Maurice