Existe-t-il une meilleure façon d'avoir un écouteur sur une collection java que d'envelopper dans une classe implémentant le modèle d'observateur?Bon moyen d'avoir un collectionneur?
Répondre
Vous devriez vérifier Glazed Lists
Il contient des classes Liste observables, les événements de feu lorsque des éléments sont ajoutés, supprimés, remplacés, etc
Eh bien, si vous n'avez pas réellement besoin d'une instance java.util.Collection ou List, vous pouvez utiliser un DefaultListModel. Je ne connais aucune implémentation de collection "réelle" avec un support d'écoute/d'observation intégré.
Vous lié la version Java 6 de DefaultListModel, qui n'utilise pas de génériques. La version de [Java 7] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) fait, ce qui pourrait rendre votre suggestion plus attrayante. –
@MartinRust bien, oui, la réponse est de 2 ans avant que Java 7 est sorti. Si je vais le mettre à jour, je pourrais aussi bien utiliser Java 8 maintenant –
Apache Events. "Commons-Events fournit des classes supplémentaires pour le déclenchement et la gestion des événements.Il se concentre sur le Java Collections Framework, fournissant des décorateurs à d'autres collections qui déclenchent des événements."
Doit être noté que c'est toujours un projet sandbox. Un intéressant cependant. – BalusC
Vous pouvez en utilisant la ForwardingSet, ForwardingList, etc., de Guava à décorer une instance particulière avec le comportement souhaité.
Voilà ma propre implémentation qui utilise simplement les API JDK simples:
// create an abstract class that implements this interface with blank implementations
// that way, annonymous subclasses can observe only the events they care about
public interface CollectionObserver<E> {
public void beforeAdd(E o);
public void afterAdd(E o);
// other events to be observed ...
}
// this method would go in a utility class
public static <E> Collection<E> observedCollection(
final Collection<E> collection, final CollectionObserver<E> observer) {
return new Collection<E>() {
public boolean add(final E o) {
observer.beforeAdd(o);
boolean result = collection.add(o);
observer.afterAdd(o);
return result;
}
// ... generate rest of delegate methods in Eclipse
};
}
Il y a plusieurs façons d'y parvenir - souvent j'utiliser cette approche
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ObservableArrayList<E> extends ArrayList<E> {
private @interface MethodId {
private static final int REMOVE = 2;
private static final int ADD = 1;
}
public interface ListObserver<E> {
void onElementAdded(E element);
void onElementRemoved(E element);
}
public ObservableArrayList(int capacity) {
super(capacity);
ensureObserver();
}
public ObservableArrayList() {
ensureObserver();
}
public ObservableArrayList(Collection<? extends E> collection) {
super(collection);
ensureObserver();
}
private List<WeakReference<ListObserver<E>>> _listObserverWeakRefList;
public void addObserver(ListObserver<E> observer) {
_listObserverWeakRefList.add(new WeakReference<ListObserver<E>> (observer));
}
private void ensureObserver() {
if (_listObserverWeakRefList == null) {
_listObserverWeakRefList = new ArrayList<>();
}
}
@Override
public boolean add(E object) {
super.add(object);
callObservable(MethodId.ADD, object);
return true;
}
@Override
public boolean remove(Object object) {
boolean removed = super.remove(object);
if (removed) callObservable(MethodId.REMOVE, object);
return removed;
}
private void callObservable(@MethodId int methodId, Object element) {
for (WeakReference<ListObserver<E>> observerRef : _listObserverWeakRefList) {
ListObserver<E> observer = observerRef.get();
if (observer != null) {
switch (methodId) {
case MethodId.ADD:
observer.onElementAdded((E) element);
break;
case MethodId.REMOVE:
observer.onElementRemoved((E) element);
break;
}
}
}
}
}
- 1. Un bon moyen d'attraper KeyError dans Django?
- 2. le bon moyen d'ajouter twitter
- 3. Un bon moyen d'avoir un fil de travail sans fin?
- 4. Est-ce un bon moyen de fermer un thread?
- 5. Bon moyen de faire un "switch" dans un Makefile
- 6. Est-ce un bon moyen d'être root dans un makefile?
- 7. Un bon moyen de vérifier les appels Java Reflection?
- 8. Quelqu'un a un bon moyen de déboguer WPF focus?
- 9. Est-ce un bon moyen de faire JS OOP?
- 10. Un bon moyen d'afficher de grandes images en ligne
- 11. Un bon moyen d'avoir tous mes messages en Java
- 12. Quel est un bon moyen de gérer Postfix?
- 13. Est-ce un bon moyen d'attraper des robots?
- 14. est-il un bon moyen d'afficher trop d'informations dans ASP.NET?
- 15. Quel est un bon moyen d'exécuter JavaScript de manière interactive?
- 16. Quel est un bon moyen d'obtenir la taille du fichier?
- 17. Bon moyen de formater les données dans un grand DataTable
- 18. Un bon moyen de déclarer une fonction en PHP?
- 19. Un bon moyen d'exécuter le script JQuery suivant?
- 20. Quel est un bon moyen de rendre les polices décrites?
- 21. Quel est un bon moyen d'implémenter HCI dans OpenGL?
- 22. Est-ce un bon moyen d'utiliser les DLL? (? C++)
- 23. Quel est un bon moyen de réécrire la fonctionnalité ActiveX?
- 24. Quel est un bon moyen de produire un asp.net, C# GridView dans un fichier PDF
- 25. Quel est un bon moyen d'assigner un objet modèle à un symbole après l'avoir sauvegardé?
- 26. Quel est un bon moyen de paramétrer un ValueConverter utilisé dans un ControlTemplate?
- 27. Quel est un bon moyen d'attacher une valeur numérique à un élément?
- 28. La liaison de données est un bon moyen de connecter une vue à un modèle
- 29. Quel est un bon moyen de refactoriser un module Perl monstre en sous-modules?
- 30. Un bon moyen de faire la gestion de session en Python + Pylons pour un programmeur php
D'accord. GlazedLists est excellent. – Barend
En effet, une ou deux des mêmes personnes ont travaillé sur les deux ... –
TransformationLists de Glazed Lists s'attend à ce que dispose() soit invoqué manuellement au lieu d'utiliser WeakReferences pour les auditeurs ....? 0.o Il doit y avoir quelque chose de mieux là-bas. – user515655