(NOTA: He actualizado este post tras darse cuenta de algunos errores de mi propia por lo que este no es el original, pero una vez más refinado)
Para ello me gustaría hacer dos nuevos interfaces, ListListener
y Listenable
y luego crearía una nueva clase como ListenableArrayList
que envolvería cada método List
con una llamada a uno (o más) métodos relevantes definidos en ListListener
. En el código sería algo como esto:
public class ListenableArrayList<T> extends ArrayList<T>
implements Listenable<T> {
private ArrayList<T> internalList;
private ListListener<T> listener;
/* .. */
public void add(T item) {
listener.beforeAdd(T item);
internalList.add(item);
listener.afterAdd(T item);
}
/* .. */
public void setListener(ListListener<T> listener) {
this.listener = listener;
}
}
public interface ListListener<T> {
/* .. */
void beforeAdd(T item);
void afterAdd(T item);
/* .. */
}
public interface Listenable<T> {
/* .. */
void setListener(ListListener<T> listener);
/* .. */
}
La razón por la que lo haría de esta manera sería la de permitir la creación de oyentes verdaderamente ad-hoc sobre la marcha en lugar de atar el ListenableArrayList a alguna aplicación específica. Por ejemplo, con esto, el siguiente sería posible:
Listenable<String> list = new ListenableArrayList<String>();
list.setListener(new ListListener<String>() {
@Override
public void beforeAdd(String item) {
System.out.println("About to add element "+item+"...");
}
@Override
public void afterAdd(String item) {
System.out.println("...element "+item+" has been added.");
}
});
Un poco desordenado, tal vez, pero por otro lado esto permitiría una fácil extensión a las colecciones, conjuntos y otras cosas con bastante facilidad.
Eso es lo que normalmente hago también. Solo curiosidad por lo que todos los demás estaban haciendo. Al menos obtuve un buen enlace a Collection que en realidad es oberserable. :) – willcodejavaforfood
La respuesta de AndreyChaschev no necesita ninguna biblioteca externa (pero requiere Java7) – Benj
@Benj: no sorprende que la respuesta de hace 8 años ya no sea relevante ;-) –