Gibt es eine bessere Möglichkeit, einen Listener in einer Java-Sammlung zu verwenden, als ihn in eine Klasse zu integrieren, die das Beobachtermuster implementiert?Gute Möglichkeit, einen Sammlungshörer zu haben?
Antwort
sollten Sie überprüfen Glazed Lists
Es beobachtbaren Liste Klassen enthält, die Brandereignisse, wenn Elemente hinzugefügt, entfernt, ersetzt, etc
Nun, wenn Sie eine java.util.Collection- oder List-Instanz nicht benötigen, können Sie eine DefaultListModel verwenden. Ich kenne keine "echten" Collection-Implementierungen mit integrierter Listener/Observer-Unterstützung.
Sie die Java-Version 6 von DefaultListModel verbunden, die keine Generika verwendet. Die [Java 7-Version] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) tut das, was Ihren Vorschlag attraktiver machen könnte. –
@MartinRust gut, ja, die Antwort ist von 2 Jahren vor Java 7 kam. Wenn ich es aktualisiere, könnte ich genauso gut Java 8 jetzt –
"Commons-Events bietet zusätzliche Klassen zum Auslösen und Behandeln von Ereignissen. Es konzentriert sich auf das Java Collections Framework und stellt Dekoratoren für andere Sammlungen bereit, die Ereignisse auslösen."
verwenden. Sollte beachtet werden, dass dies noch ein Sandbox-Projekt ist. Ein interessanter jedoch. – BalusC
Sie können mit der ForwardingSet, ForwardingList usw. von Guava zu schmücken Sie eine bestimmte Instanz mit dem gewünschten Verhalten.
Hier ist meine eigene Implementierung, die einfach nur JDK-APIs verwendet:
// 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
};
}
gibt es diese viele Möglichkeiten zu erreichen - oft ich diesen Ansatz
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. Was ist eine gute Möglichkeit, einen Vektor * vorübergehend * zu sortieren?
- 2. MD5 ist eine gute Möglichkeit, einen Kontobestätigungscode zu erstellen
- 3. Gute Möglichkeit, einen "Schalter" in einem Makefile zu tun
- 4. Die gute Möglichkeit, mehrere Threads zu steuern
- 5. Gute Möglichkeit, den verfügbaren Browserbereich zu schätzen
- 6. Was ist eine gute Möglichkeit, einen Datumsfilter in einer Liste zu implementieren, in der die Elemente unterschiedliche Zeitzonen haben?
- 7. Gute Möglichkeit, Begriffe zu Python-Muster zu addieren singularize
- 8. Gibt es eine gute Möglichkeit, jQuery-Code zu validieren?
- 9. Was ist eine gute Möglichkeit, einen Typ beim Verfassen von Kommentaren zu einem Plural zu machen?
- 10. Gute Möglichkeit, Felder in Actionscript Array umzubenennen?
- 11. Was ist eine gute Möglichkeit, binäre Daten an einen HTTP-REST-API-Dienst zu übertragen?
- 12. Ist Configuration.GenerateSchemaUpdateScript() in NHibernate eine gute Möglichkeit, Datenbankschemaänderungen zu verwalten
- 13. Gute Möglichkeit, ungültige Zeichen in Firebase-Schlüssel zu ersetzen?
- 14. gibt es eine gute Möglichkeit, Stream Manipulatoren zu kombinieren?
- 15. Gute Möglichkeit, zwischen kurzen und Bytes zu konvertieren?
- 16. Eine gute Möglichkeit, verwendbare Callbacks in C++ zu implementieren
- 17. was ist eine gute Möglichkeit, letzten Verzeichnis zu entfernen
- 18. Was ist eine gute Möglichkeit, Protokolle zu formatieren?
- 19. Eine gute Möglichkeit, diese Browser-Versionen zu speichern - Django/Postgresql
- 20. Was ist eine korrekte und gute Möglichkeit, __hash __() zu implementieren?
- 21. Was ist eine gute Möglichkeit, Strings hier zu teilen?
- 22. Gute Möglichkeit, Tests zu isolieren, die von einem Initialisierer abhängen
- 23. Gute Möglichkeit, socket.io mit Cluster im Multicore-Server zu verwenden?
- 24. Gibt es eine gute Möglichkeit, Rückgabetypen beim Refactoring zu überprüfen?
- 25. Gute Möglichkeit, CGImageCreateWithImageInRect, UIImage und UIImagePickerController Fragen zu verwenden
- 26. Eine gute Möglichkeit, große Bilder online anzuzeigen
- 27. Was ist eine gute Methode, um einen Befehlsnamen zu erfinden?
- 28. Gibt es eine Möglichkeit, einen einzigen Link zu Google-Fonts mit Platzhalter zu haben?
- 29. Scala: gute Möglichkeit, Paare von Strings zu halten
- 30. Was ist eine gute Möglichkeit, Sub/Pub zu dokumentieren?
Einverstanden. GlazedLists ist ausgezeichnet. – Barend
In der Tat, ein oder zwei der gleichen Leute arbeiteten an ihnen beide ... –
Glazed Lists 'TransformationList erwartet dispose() manuell aufgerufen werden, anstatt WeakReferences für Listeners ....? 0.o Da draußen muss es etwas Besseres geben. – user515655