2016-09-05 2 views
-1

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

+0

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? –

+0

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

+0

@TimBiegeleisen Comment faire un auditeur d'une classe à l'autre, avez-vous des références? –

Répondre

1

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"); 
+1

Par souci de cohérence, j'écrirais également 'addAll' –

+0

Pour une bonne conception, je ne voudrais pas étendre' ArrayList', mais préférer la composition à l'héritage. – Kayaman

0

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é.

0

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.