(NOTE: Je mis à jour ce poste après avoir réalisé quelques erreurs de ma propre si ce n'est pas l'original mais un plus raffiné à la place)
A cet effet, je ferais deux nouvelles interfaces, ListListener
et Listenable
puis je voudrais créer une nouvelle classe comme ListenableArrayList
qui encapsulerait chaque List
méthode avec un appel à une (ou plusieurs) des méthodes pertinentes définies dans ListListener
. Dans le code, il serait quelque chose comme ceci:
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 raison pour laquelle je le ferais de cette façon serait de permettre la création d'auditeurs vraiment ad hoc à la volée au lieu de lier le ListenableArrayList à une mise en œuvre spécifique. Par exemple, avec ce qui suit serait possible:
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 peu encombrés, peut-être, mais d'autre part, cela permettrait l'extension facile aux collections, jeux et autres joyeusetés assez facilement.
C'est ce que je fais normalement aussi bien. Juste curieux de savoir ce que tout le monde faisait. Au moins, j'ai un joli lien vers Collection qui sont en fait oberserable. :) – willcodejavaforfood
La réponse de AndreyChaschev n'a pas besoin de bibliothèque externe (mais nécessite Java7) – Benj
@Benj: pas de surprise que la réponse d'il y a 8 ans n'est plus pertinente ;-) –