¿Hay una mejor manera de tener un oyente en una colección java que envolverlo en una clase que implementa el patrón de observador?¿Es una buena manera de tener un oyente de la colección?
Respuesta
Debe retirar Glazed Lists
Contiene clases Lista observables, que los incendios cuando se añadan elementos, extrae, se sustituye, etc
Bueno, si realmente no necesita una instancia java.util.Collection o List, puede usar un DefaultListModel. No conozco ninguna implementación de Colección "real" con compatibilidad incorporada de escucha/observador.
se enlazó la versión Java 6 de DefaultListModel, que no usa genéricos La [versión de Java 7] (http://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultListModel.html) lo hace, lo que puede hacer que su sugerencia sea más atractiva. –
@MartinRust Bueno, sí, la respuesta es de 2 años antes de que saliera Java 7. Si voy a actualizarlo, también podría usar Java 8 ahora –
"Commons-Events proporciona clases adicionales para disparar y manejar eventos. Se centra en el Java Collections Framework, que proporciona decoradores a otras colecciones que disparan eventos".
Debe tenerse en cuenta que este sigue siendo un proyecto de recinto de seguridad. Sin embargo, es interesante. – BalusC
Puede usar el ForwardingSet, ForwardingList, etc., de Guava a decorar una instancia particular con el comportamiento deseado.
Aquí es mi propia aplicación que sólo utiliza las API de JDK de civil:
// 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
};
}
hay muchas maneras de lograr esto - a menudo i utilizar este enfoque
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. una buena colección de C#
- 2. ¿Cuál es una buena manera de construir un proyecto Backbone.js?
- 3. mejor manera de probar si un tipo es una colección
- 4. ¿Es esta una buena manera de reutilizar/compartir un método?
- 5. ¿Cuál es una buena manera de * temporalmente * ordenar un vector?
- 6. ¿Es una buena práctica tener consulta de linq en Controladores?
- 7. Una buena manera de almacenar enteros únicos
- 8. ¿Cuál es la mejor manera de convertir una colección no genérica en una colección genérica?
- 9. ¿Cuál es una buena manera de representar las fuentes delineadas?
- 10. Es regex una buena manera de probar una url
- 11. cuál es una buena manera de eliminar los últimos directorios
- 12. La mejor manera de ordenar una colección en un CompositeView
- 13. ¿Es esta una buena manera de liberar memoria?
- 14. ¿Cuál es una buena manera de depurar el código haskell?
- 15. ¿Es esta una buena manera de hacer JS OOP?
- 16. ¿Es esta una buena manera de utilizar Namespaces en PHP
- 17. ¿Cuál es una buena manera de probar un archivo para ver si es un archivo zip?
- 18. ¿Cuál es una buena manera pitonica de encontrar objetos duplicados?
- 19. ¿Cuál es una buena manera de dividir cadenas aquí?
- 20. ¿Cuál es una buena manera de verificar si un doble es un número entero en C#?
- 21. Clearing cin input: es cin.ignore no es una buena manera?
- 22. ¿Cuál es una buena manera de dibujar imágenes usando pygame?
- 23. ¿Puede una colección MongoDB tener dentro otra colección?
- 24. Una buena manera de hacer un "cambio" en un Makefile
- 25. ¿Cuál es una buena manera de diseñar un reproductor multimedia en un teléfono con Windows?
- 26. Prueba de evento PropertyChanged: ¿es esta una buena manera?
- 27. Hibernar: la mejor manera de eliminar elementos en una colección
- 28. ¿Cuál es una buena manera de refactorizar un módulo monstruo de Perl en submódulos?
- 29. ¿Puede una vista principal tener más de una colección?
- 30. ¿Es esta una buena manera de hacer un ciclo de juego para un juego de iPhone?
De acuerdo. GlazedLists es excelente. – Barend
De hecho, una o dos de las mismas personas trabajaron en ellas ... –
TransformationList de Glazed Lists espera invocar dispose() en lugar de usar WeakReferences para oyentes ...? 0.o Tiene que haber algo mejor por ahí. – user515655