2012-07-20 70 views
9

這對於接口SetObserver代碼片段從有效的Java採取(避免過多的同步項67)什麼是Java中的回調接口?

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

SetObserver被傳遞到addObserver()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); 
    } 
    } 

布洛赫指SetObserver<E>接口作爲回調接口。什麼時候在Java中稱爲回調接口的接口?

+0

可能重複[什麼是回調函數?(http://stackoverflow.com/questions/824234/what-is-a-callback-function) – assylias 2012-07-20 10:42:39

+1

'ObservableSet '是不是界面,我猜你的意思'SetObserver ' – 2012-07-20 10:46:23

+0

@AlonsoDominguez是的,它是一個錯字。現在編輯問題。 – Geek 2012-07-20 10:47:41

回答

10

爲接口的一般要求是一個「回調接口」是界面提供用於被呼叫者調用調用者中的代碼的方法。主要思想是調用者有一段代碼需要在另一個組件的代碼中發生某些事情時執行。回調接口提供一種方法來通過這個代碼到組件被調用:調用者實現一個接口,和被呼叫者調用它的方法之一。

回撥機制可能不同用不同的語言來實現:C#有委託和事件除回調接口,C具有可通過指針傳遞的功能,目的C有委託協議,並依此類推。但主要想法總是相同的:調用者傳遞一段代碼以在發生某個事件時被調用。的

+0

我可能是錯的,但是在Java的情況下,說被調用者實現接口是不是正確的,以便調用者可以調用它而不是其他方式?對不起,我知道這個答案差不多3歲。 – stevenelberger 2015-03-17 07:02:50

+0

@stevenelberger我認爲當前的描述是正確的:調用者實現一個接口,將實現提供給被調用者,並且被調用者根據需要調用實現的方法。 – dasblinkenlight 2015-03-17 10:01:31