2016-09-05 1 views
-1

hinzugefügt wird Angenommen, ich eine Arraylist in KlasseA haben und ein Verfahren send in ClassB genannt, wie kann ich invoke send, wenn etwas in die Arraylist in KlasseA hinzugefügt wird?Wie eine Java-Funktion aufzurufen, wenn einige Daten in eine Arraylist

+0

Sie könnten einen Listener in 'ClassA' einrichten, der' ClassB' aktualisiert, wenn sich die Daten ändern. Können Sie etwas Code mit uns teilen? –

+0

Wie genau soll die Methode aufgerufen werden? Möchten Sie, dass es automatisch auf Basis eines 'Ereignisses' aufgerufen wird, wenn sich Daten in der ArrayList ändern oder möchten Sie' a' ändern und die Funktion selbst aufrufen? – progyammer

+0

@TimBiegeleisen Wie man einen Listener von einer Klasse zu einer anderen macht, haben Sie irgendeine Referenz? –

Antwort

1

Sie ArrayList erweitern sollten, und überschreiben die add Methode einen Zuhörer zu nennen:

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); 
} 

Und es wie folgt verwenden:

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

Aus Gründen der Konsistenz würde ich auch 'addAll' überschreiben. –

+0

Für ein gutes Design würde ich' ArrayList' nicht erweitern, sondern die Zusammensetzung über Vererbung bevorzugen. – Kayaman

0

Für die meisten Anwendungsfälle ist es die beste Idee zu definieren eine benutzerdefinierte Klasse mit und add Methode, die eine List als ein Feld enthält. Dann können Sie Ihre benutzerdefinierte Logik immer dann ausführen, wenn der add Ihrer Klasse aufgerufen wird.

0

Sie könnten eine Wrapper-Klasse für List erstellen, so dass Sie so etwas wie

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. 

ListenableListList würde implementieren tun könnte und delegieren alle Methoden auf die zugrunde liegende Liste (ArrayList im Beispiel), sowie erzeugen Veranstaltungen. Dadurch können Sie verschiedene Ereignisse zum Hinzufügen, Entfernen und sogar zum Abrufen von Elementen verwenden.

Es ist eine grundlegende proxy pattern.

Verwandte Themen