Qu'est-ce qu'une méthode de rappel en java? Terme semble être utilisé vaguement


Je ne comprends pas ce qu'est une méthode de rappel et j'ai entendu des gens utiliser ce terme très vaguement. Dans le monde java, qu'est-ce qu'une méthode de rappel? Si quelqu'un pouvait fournir un exemple de code d'une méthode de rappel java avec une explication, ce serait d'une grande aide dans mon parcours d'apprentissage java?

Merci d'avance.

Author: Horse Voice, 2013-10-16

3 answers

Un rappel est un morceau de code que vous passez comme argument à un autre code afin qu'il l'exécute. Comme Java ne prend pas encore en charge les pointeurs de fonction, ils sont implémentés en tant qu'objets de commande. Quelque chose comme

public class Test {
    public static void main(String[] args) throws  Exception {
        new Test().doWork(new Callback() { // implementing class            
            @Override
            public void call() {
                System.out.println("callback called");
            }
        });
    }

    public void doWork(Callback callback) {
        System.out.println("doing work");
        callback.call();
    }

    public interface Callback {
        void call();
    }
}

Un rappel contient généralement une référence à un état pour être utile.

En faisant en sorte que l'implémentation de rappel ait toutes les dépendances à votre code, vous obtenez une indirection entre votre code et le code qui exécute le rappel.

 29
Author: Sotirios Delimanolis, 2013-10-16 14:07:46

Une méthode de rappel en java, une méthode qui est appelée lorsqu'un événement (appelons - E) se produit. Habituellement, vous pouvez implémenter cela en passant une implémentation d'une certaine interface au système responsable du déclenchement de l'événement E (voir exemple 1).

Également dans les systèmes plus grands et plus complexes, vous pouvez simplement annoter une méthode et le système identifiera toutes les méthodes annotées et les appellera lorsque l'événement se produira (voir exemple 2). Bien sûr le système définit quoi paramètres que la méthode doit recevoir et autres contraintes.

Exemple 1:

public interface Callback {
    //parameters can be of any types, depending on the event defined
    void callbackMethod(String aParameter);
}


public class CallbackImpl implements Callback {
    void callbackMethod(String aParameter) {
     //here you do your logic with the received paratemers
     //System.out.println("Parameter received: " + aParameter);

    }
}

//.... and then somewhere you have to tell the system to add the callback method
//e.g. systemInstance.addCallback(new CallbackImpl());

Exemple 2:

//by annotating a method with this annotation, the system will know which method it should call. 
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CallbackAnnotation {}


public class AClass {

    @CallbackAnnotation
    void callbackMethod(String aParameter) {
     //here you do your logic with the received paratemers
     //System.out.println("Parameter received: " + aParameter);

    }
}

//.... and then somewhere you have to tell the system to add the callback class
//and the system will create an instance of the callback class
//e.g. systemInstance.addCallbackClass(AClass.class);
 5
Author: Andrei I, 2013-10-16 19:18:18

En Termes Simples... En clair, une fonction de rappel est comme un travailleur qui "rappelle" à son gestionnaire lorsqu'il a terminé une tâche.

En quoi sont-ils différents de l'appel d'une fonction à partir d'une autre fonction en prenant un certain contexte de la fonction appelante? Il est vrai que vous appelez une fonction à partir d'une autre fonction, mais la clé est que le rappel est traité comme un objet, vous pouvez donc changer la fonction à appeler en fonction de l'état du système (comme le Modèle de Conception de la Stratégie).

Comment expliquer leur puissance à un programmeur novice? La puissance des rappels peut facilement être vue dans les sites Web de style AJAX qui doivent extraire des données d'un serveur. Le téléchargement des nouvelles données peut prendre un certain temps. Sans rappels, toute votre interface utilisateur "gèlerait" lors du téléchargement des nouvelles données, ou vous auriez besoin d'actualiser la page entière plutôt qu'une partie de celle-ci. Avec un rappel, vous pouvez insérer une image "en cours de chargement" et la remplacer par la nouvelle les données une fois qu'il est chargé.

Certains codes sans un rappel:

     function grabAndFreeze() {
    showNowLoading(true);
    var jsondata = getData('http://yourserver.com/data/messages.json');
    /* User Interface 'freezes' while getting data */
    processData(jsondata);
    showNowLoading(false);
    do_other_stuff(); // not called until data fully downloaded
        }

      function processData(jsondata) { // do something with the data
    var count = jsondata.results ? jsondata.results.length : 0;
     $('#counter_messages').text(['Fetched', count, 'new items'].join(' '));
     $('#results_messages').html(jsondata.results || '(no new messages)');
       }

Avec Rappel: Voici un exemple avec un rappel, en utilisant getJSON de jQuery:

    function processDataCB(jsondata) { // callback: update UI with results
   showNowLoading(false);
   var count = jsondata.results ? jsondata.results.length : 0;
   $('#counter_messages').text(['Fetched', count, 'new items'].join(' '));
   $('#results_messages').html(jsondata.results || '(no new messages)');
          }

`   `function grabAndGo() { // and don't freeze
    showNowLoading(true);
    $('#results_messages').html(now_loading_image);
    $.getJSON("http://yourserver.com/data/messages.json", processDataCB);
    /* Call processDataCB when data is downloaded, no frozen User Interface!                              
    do_other_stuff(); // called immediately
 1
Author: garvit94, 2018-06-07 02:00:17