2016-02-19 3 views
8

私は、クラスAと命名していると私は私のクラスAにBのインスタンスを持っているとBのインスタンスが何らかの形で更新された場合、どのように私はクラスの私のインスタンスを通知することができた場合は、そのコンポーネントのクラスはB.イベントのクラスコンポーネントにどのように通知するのですか?

public class A { 
    B myB; 

    ... 
    public void bWasUpdated(){ 
     ... 
     List<String> list = myB.connections; 
    } 
} 

と呼ばれますAと電話bWasUpdated()

私はインターフェースを試しましたが、本当に混乱しました。私はオブジェクトとそのコンポーネントの間でまだデータを渡す方法をあまり理解していないと思います。

EDIT

public class B { 
    ArrayList<String> connections; 

    .... 

    public void listen(){ 

     ... 
     if(foundNewConnection){ 
      this.connections.add(theNewConnection); 
      //Notify class A about this new connection; 
     } 
    } 
} 
+0

「A.myB」を外界にどのように公開していますか? _setter_メソッドを使用している場合は、 'B'インスタンスがいつ更新されたかを知ることができます。 –

+0

クラスBに関する詳細情報を提供できますか? – waxtah

+0

もちろん、私はクラスBをContactManagerと呼びますが、それは基本的に着信接続に対してソケットを使用して聴いています。私のインスタンスbはこれらの接続のリストを保持しており、新しい接続が行われたときにクラスAに通知したいと思います! – wayway

答えて

11

あなたはObserver patternと呼ばれるパターンの形であるリスナーを、使用する必要があります。

まず、あなたのBクラスにこのインターフェイスを追加します。

public interface ChangeListener { 
    public void onChangeHappened(); 
} 

第二に、セッターでBへのリスナーの変数を追加します。

private ChangeListener listener; 

public void setChangeListener(ChangeListener listener) { 
    this.listener = listener; 
} 

第三に、のChangeListenerインタフェースとレジスタを実装しますリスナーとしての自分自身:

public class A implements ChangeListener { 

public A() { 
    myB = new B(); 
    myB.setChangeListener(this); 
} 

... 

public void onChangeHappened() { 
    // do something with B now that you know it has changed. 
} 

最後に、少なくともリ何かが変わったとき:

public void someMethodInB() { 
    // change happened 
    if (listener != null) { 
     listener.onChangeHappened(); 
    } 
} 
+0

このパターンはまさに私が必要としていたようです!私はそれを試してみましょう! – wayway

+0

この回答をいただきありがとうございます!私は間違いなく今正しく使用するインターフェイスを正しく使用する方法を理解しています! – wayway

+0

あなたの歓迎!私はそれが助けてうれしいです。 – FlyingPumba

3

B場合 - Aの内部クラスは、あなたがBセッター(または他の状態改質剤)A.this.bWasUpdatedに呼び出すことができます()。

+0

私はA.のための静的メソッドに頼るのを避けたいです。 – wayway

+1

静的メソッドを必要としないこの答えのためによく。それはインターフェイスなしでうまく動作します(AのB -innerクラスの場合) – Bharatesh

関連する問題