2016-09-05 3 views
-1

ClassAにArrayListがあり、ClassBにsendというメソッドがあるとします。 ClassAのArrayListに何かが追加されたときに、どうすればsendを呼び出すことができますか?データがarraylistに追加されたときにJava関数を呼び出す方法

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

そして、このようにそれを使用します:

+0

データが変更されるたびに 'ClassB'を更新する' ClassA'のリスナーをセットアップすることができます。私たちといくつかのコードを共有できますか? –

+0

どのようにしてメソッドを呼び出したいのですか? ArrayListのデータが変更されたときに 'event'に基づいて自動的に呼び出されるようにしたいのですか、' a'を修正して関数を自分で呼びたいのですか? – progyammer

+0

@TimBiegeleisenあるクラスから別のクラスへのリスナーの作成方法を教えてください。 –

答えて

1

あなたはリスナーを呼び出すためにArrayListを拡張し、addメソッドをオーバーライドする必要があり、ほとんどのユースケースについては

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

一貫性を保つために、 'addAll'も上書きします。 –

+0

良いデザインのために、私は' ArrayList'を拡張しませんが、継承よりも合成を優先します。 – Kayaman

0

、それを定義するための最良のアイデアですフィールドにはListを保持するaddメソッドを持つカスタムクラスです。次に、クラスのaddが呼び出されるたびにカスタムロジックを実行できます。

0

あなたは

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ような何かを行うことができますので、あなたがListを実装し、基本的なリスト(例ではArrayList)へのすべてのメソッドを委譲だけでなく、生成するであろう、Listのためのラッパークラスを作成することができますイベント。これにより、要素の追加、削除、さらには取得までのイベントが異なります。

基本proxy patternです。

関連する問題