2012-07-20 12 views
9

インターフェイスSetObserverためのこのコードスニペットをJavaのコールバックインターフェイスとは何ですか?

public interface SetObserver<E> { 
// Invoked when an element is added to the observable set 
void added(ObservableSet<E> set, E element); 
} 

(過剰同期アイテム67を避けて)有効ジャワから取得され、以下に与えられるようSetObserveraddObserver()removeObserverメソッドに渡される:

// Broken - invokes alien method from synchronized block! 
public class ObservableSet<E> extends ForwardingSet<E> { 
    public ObservableSet(Set<E> set) { 
    super(set); 
    } 

    private final List<SetObserver<E>> observers = 
     new ArrayList<SetObserver<E>>(); 

    public void addObserver(SetObserver<E> observer) { 
    synchronized (observers) { 
     observers.add(observer); 
    } 
    } 



    public boolean removeObserver(SetObserver<E> observer) { 
    synchronized (observers) { 
     return observers.remove(observer); 
    } 
    } 



    private void notifyElementAdded(E element) { 
    synchronized (observers) { 
     for (SetObserver<E> observer : observers) 
     observer.added(this, element); 
    } 
    } 

ブロッホは、インターフェイスをコールバックインターフェイスとして参照しています。 Javaでコールバックインターフェイスと呼ばれるインターフェイスはいつですか?

+0

[コールバック関数は何?](http://stackoverflow.com/questions/824234/what-is-a-callback-function) – assylias

+1

'ObservableSet は'ないのが重複する可能性あなたが 'SetObserver ' –

+0

@AlonsoDominguezはい、それはタイプミスだったと思います。今質問を編集する。 – Geek

答えて

10

インターフェイスが「コールバックインターフェイス」になるための一般的な要件は、インターフェイスが呼び出し元のコードを呼び出す方法をインターフェイスに提供することです。主な考え方は、呼び出し元に別のコンポーネントのコード内で何かが起きたときに実行する必要のあるコードがあることです。コールバックインターフェイスは、呼び出されているコンポーネントにこのコードを渡す方法を提供します。呼び出し元はインターフェイスを実装し、呼び出し先はそのメソッドの1つを呼び出します。

コールバックメカニズムは、さまざまな言語で異なる方法で実装できます.C#には、コールバックインターフェイスに加えて代理人とイベントがあります.Cにはポインターで渡すことのできる関数があり、ObjectiveCには代理プロトコルがあります。しかし、主な考え方は常に同じです。呼び出し元は、特定のイベントの発生時に呼び出されるコードを渡します。

+0

私は間違っているかもしれませんが、Javaの場合、呼び出し先がインターフェースを実装しているので、呼び出し元がそれを逆に呼び出すことはできません。申し訳ありませんが、私はこの回答がほぼ3歳であることを知っています。 – stevenelberger

+0

@stevenelberger私は現在の記述が正しいと思います:呼び出し側はインタフェースを実装し、その実装を呼び出し側に与え、呼び出し側は必要に応じて実装のメソッドを呼び出します。 – dasblinkenlight

関連する問題