2012-07-20 33 views
9

Đoạn mã này cho SetObserver giao diện được lấy từ Java hiệu quả (Tránh quá mức đồng bộ hóa mục 67)Giao diện gọi lại trong Java là gì?

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

SetObserver được chuyển cho addObserver()removeObserver phương pháp như đưa ra dưới đây:

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

Bloch tham chiếu đến giao diện SetObserver<E> dưới dạng giao diện gọi lại gọi. Khi nào một giao diện được gọi là giao diện gọi lại trong Java?

+0

thể trùng lặp của [một hàm callback là gì?] (Http://stackoverflow.com/questions/824234/what-is-a-callback-function) – assylias

+1

'ObservableSet 'không là một giao diện, tôi đoán bạn có nghĩa là 'SetObserver ' –

+0

@AlonsoDominguez có nó là một lỗi đánh máy. chỉnh sửa câu hỏi ngay bây giờ. – Geek

Trả lời

10

Yêu cầu chung cho giao diện là "giao diện gọi lại" là giao diện cung cấp cách để callee gọi mã bên trong người gọi. Ý tưởng chính là người gọi có một đoạn mã cần được thực thi khi có điều gì đó xảy ra trong mã của một thành phần khác. Các giao diện gọi lại cung cấp một cách để chuyển mã này tới thành phần đang được gọi: người gọi thực hiện một giao diện và callee gọi một trong các phương thức của nó.

Cơ chế gọi lại có thể được thực hiện khác nhau bằng các ngôn ngữ khác nhau: C# có đại biểu và sự kiện ngoài giao diện gọi lại, C có chức năng có thể được truyền bởi con trỏ, Objective C có giao thức đại biểu, v.v. Nhưng ý tưởng chính là luôn luôn giống nhau: người gọi vượt qua một đoạn mã được gọi khi xảy ra một sự kiện nào đó.

+0

Tôi có thể sai, nhưng trong trường hợp của Java, nó sẽ không chính xác để nói rằng callee thực hiện giao diện để người gọi có thể gọi nó trở lại và không phải là cách khác xung quanh? Xin lỗi, tôi biết câu trả lời này đã gần 3 tuổi. – stevenelberger

+0

@stevenelberger Tôi nghĩ rằng mô tả hiện tại là đúng: người gọi thực hiện một giao diện, cung cấp cho việc thực hiện để callee, và callee gọi lại phương pháp thực hiện khi cần thiết. – dasblinkenlight

Các vấn đề liên quan