En supposant que j'ai un ArrayList dans ClassA et une méthode nommée send
dans ClassB, comment puis-je invoquons send
chaque fois que quelque chose est ajouté à la liste de tableaux dans ClassA?Comment appeler une fonction java lorsque certaines données sont ajoutées à une liste de tableaux
Répondre
Vous devez étendre ArrayList
et remplacer la méthode add
pour appeler un auditeur:
class MyArrayList<T> extends ArrayList<T> {
private MyArrayListListener<T> listener;
public void setListener(MyArrayListListener<T> listener) {
this.listener = listener;
}
@Override
public boolean add(T t) {
if(listener != null) {
listener.elementAdded(t);
}
return super.add(t);
}
}
interface MyArrayListListener<T> {
void elementAdded(T element);
}
Et l'utiliser comme ceci:
MyArrayList<String> list = new MyArrayList<>();
list.setListener(new MyArrayListListener<String>() {
@Override
public void elementAdded(String element) {
// do whatever you want
}
});
list.add("elementAdded gets called now");
Par souci de cohérence, j'écrirais également 'addAll' –
Pour une bonne conception, je ne voudrais pas étendre' ArrayList', mais préférer la composition à l'héritage. – Kayaman
Pour la plupart des cas d'utilisation, il est la meilleure idée de définir une classe personnalisée avec la méthode add
qui contient un champ List
. Ensuite, vous pouvez faire votre logique personnalisée à chaque fois que le add
de votre classe est appelé.
Vous pouvez créer un pour que vous puissiez faire quelque chose comme
ListenableList<String> list = new ListenableList<>(new ArrayList<>());
list.addListener(...);
public class ListenableList<T> implements List<T> {
private List<T> list;
public ListenableList(List<T> list) {
this.list = list;
}
public void add(T element) {
list.add(element);
invokeAddEvent();
}
// etc.
ListenableList
mettrait en œuvre List
et déléguer toutes les méthodes à la liste sous-jacente (ArrayList
dans l'exemple) classe wrapper pour List
, ainsi que de générer événements. Cela vous permettrait d'avoir différents événements pour ajouter, supprimer et même obtenir des éléments. Il s'agit d'une base proxy pattern.
Vous pouvez configurer un écouteur dans 'ClassA' qui mettrait à jour' ClassB' chaque fois que les données changent. Pouvez-vous partager du code avec nous? –
comment voulez-vous exactement que la méthode soit invoquée? Voulez-vous qu'il soit appelé automatiquement en fonction d'un 'event' quand les données de ArrayList changent ou voulez-vous modifier' a' et appeler la fonction vous-même? – progyammer
@TimBiegeleisen Comment faire un auditeur d'une classe à l'autre, avez-vous des références? –