Accueil > Java, Programmation > Observer/Observable Java: fuites mémoire

Observer/Observable Java: fuites mémoire

23/04/2010 jmguilla Editer

This post is also available in: Anglais

ProActive Virtual Machine Management est un projet auquel je contribue. A différent moments nous avons eu besoin du patron Observer/Observable fourni par Oracle – Java mais n’étions pas réellement satisfait. Son utilisation dans une API ou l’utilisateur ne se préocupe pas de la destruction des objets entraine des fuites mémoires dues aux objets enregistrés comme écouteurs n’étant jamais garbage collectés.

Pour y remédier, nous avons écrit notre propre fonctionnalité Observer/Obserable basée sur les WeakReference Java. Voici le code:

La classe NotifierAdapter est l’équivalent de Observable

public class NotifierAdapter implements Notifier {
    private ArrayList<WeakReference<NotifierListener<N, T>>> listeners = new ArrayList<WeakReference<NotifierListener<N, T>>>();
    private N notifier;
 
    protected NotifierAdapter() {
        this.notifier = (N) this;
    }
 
    public NotifierAdapter(N notifier) {
        this.notifier = notifier;
    }
 
    public void addNotifierListener(NotifierListener<N, T> listener) {
        WeakReference<NotifierListener<N, T>> weakListenerReference = new WeakReference<NotifierListener<N, T>>(listener);
        this.listeners.add(weakListenerReference);
    }
 
    public void removeNotifierListener(NotifierListener<N, T> listener) {
        for (int i = 0; i < this.listeners.size(); i++) {
            WeakReference<NotifierListener<N, T>> weakListenerReference = this.listeners.get(i);
            NotifierListener<N, T> weakListener = weakListenerReference.get();
            if ((weakListener == null) || (weakListener == listener)) {
                this.listeners.remove(weakListenerReference);
            }
        }
    }
 
    public void fire(T event) {
        ArrayList<WeakReference<NotifierListener<N, T>>> toDelete = new ArrayList<WeakReference<NotifierListener<N, T>>>();
        for (WeakReference<NotifierListener<N, T>> weakListenerReference : listeners) {
            NotifierListener<N, T> weakListener = weakListenerReference.get();
            if (weakListener == null) {
                toDelete.add(weakListenerReference);
            } else {
                weakListener.update(this.notifier, event);
            }
        }
        listeners.removeAll(toDelete);
    }
}

L’équivalent de l’interface Observer : NotifierListener

public interface NotifierListener {
    public void update(N notifier, T event);
}

Et notre propre interface Notifier

public interface Notifier {
    public void addNotifierListener(NotifierListener listener);
 
    public void removeNotifierListener(NotifierListener listener);
 
    public void fire(T event);
}
Categories: Java, Programmation Tags: ,
Les commentaires sont fermés.