2012-07-20 13 views
9

Este fragmento de código para el SetObserver interfaz se toma de Effective Java (Evitar la sincronización excesiva artículo 67)¿Qué es una interfaz de devolución de llamada en Java?

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

Y el SetObserver se pasa a addObserver() y removeObserver método como se indica a continuación:

// 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 se refiere a la interfaz SetObserver<E> como call back interface. ¿Cuándo se llama una interfaz llamada call back en Java?

+0

posible duplicado de [¿Qué es una función de devolución de llamada?] (Http://stackoverflow.com/questions/824234/what-is-a-callback-function) – assylias

+1

'' ObservableSet no es una interfaz, supongo que te refieres a 'SetObserver ' –

+0

@AlonsoDominguez sí, fue un error tipográfico. editando la pregunta en este momento. – Geek

Respuesta

10

Un requisito general para que una interfaz sea una "interfaz de devolución de llamada" es que la interfaz proporciona una forma para que el destinatario invoque el código dentro de la persona que llama. La idea principal es que la persona que llama tiene un fragmento de código que debe ejecutarse cuando sucede algo en el código de otro componente. Las interfaces de devolución de llamada proporcionan una forma de pasar este código al componente al que se llama: el que llama implementa una interfaz y el invocador invoca uno de sus métodos.

El mecanismo de devolución de llamada se puede implementar de manera diferente en diferentes idiomas: C# tiene delegados y eventos además de interfaces de devolución de llamada, C tiene funciones que se pueden pasar por puntero, Objective C tiene protocolos de delegado, etc. Pero la idea principal es siempre la misma: el que llama pasa un trozo de código para ser invocado cuando ocurre un determinado evento.

+0

Puedo estar equivocado, pero en el caso de Java, ¿no sería correcto decir que el llamador implementa la interfaz para que la persona que llama pueda devolverla y no al revés? Lo siento, sé que esta respuesta tiene casi 3 años. – stevenelberger

+0

@stevenelberger Creo que la descripción actual es correcta: la persona que llama implementa una interfaz, le da esa implementación al destinatario, y llama a los métodos devueltos de la implementación según sea necesario. – dasblinkenlight

Cuestiones relacionadas