1. Introduction
Dans de nombreux langages de programmation, le concept de rappels de fonction est présent. Il existe des pointeurs de fonction dans C et C ++, donc les fonctions peuvent être transmises en tant que paramètres à d'autres fonctions pour l'appel ultérieur. Dans JavaScript, les rappels de fonction sont mis à l'extrême. La gestion de divers événements, en particulier les événements asynchrones, est essentiellement complété par des rappels de fonctions.
Dans Java, les rappels de fonction peuvent également être implémentés. Bien qu'il n'y ait pas de pointeur de fonction, Java peut obtenir une méthode de classe via un mécanisme de réflexion, le passer à d'autres fonctions comme un paramètre de type java.lang.reflect.method, puis appelez la fonction via la méthode invoquée de l'objet de méthode.
Néanmoins, les étapes d'appel de cette manière sont relativement lourdes, inefficaces dans l'exécution et difficiles à déboguer. En Java, il existe un mécanisme plus élégant que les rappels de fonction, c'est-à-dire les interfaces.
2. Pourquoi les rappels de fonction ont-ils besoin
Les rappels de fonction sont en fait un moyen de retarder l'implémentation de certaines fonctions.
Si nous savons à l'avance les opérations que le programme doit effectuer, il n'y a pas du tout besoin de rappels de fonctions et il peut être implémenté directement lors de la programmation.
Mais plusieurs fois, lors de l'écriture de code, en particulier lors de l'écriture de classes d'outils, de bibliothèques de fonctions ou de cadres, des fonctions relativement générales et abstraites sont implémentées, tandis que les fonctions dans des scénarios spécifiques sont implémentées par les développeurs utilisant ces classes.
Les rappels de fonction peuvent résoudre cette situation où vous ne connaissez pas à l'avance l'implémentation spécifique.
Exemples de fonctions de tri
Par exemple, lorsque nous voulons mettre en œuvre une fonction de tri générale, nous ne savons pas à l'avance quels types d'éléments d'autres développeurs utiliseront pour trier, et nous ne savons pas quelles normes pour juger la relation d'ordre partiel (taille) de ces éléments.
Par conséquent, d'autres développeurs peuvent être nécessaires pour fournir une fonction de comparaison lors de l'utilisation de fonctions de tri, afin que nous puissions utiliser la comparaison pour comparer la taille des éléments à tri sans savoir à l'avance quel est le type d'éléments, ni la mise en œuvre spécifique de la comparaison.
Ici, la fonction compare est une fonction de rappel pour la fonction de tri.
Le pseudo-code est représenté comme suit:
// la fonction générale de tri void tri (objet [] array, méthode compare) {// Utilisez la fonction compare pour comparer la relation de taille des éléments dans le tableau // trier le tableau} // La fonction de comparaison spécifique est implémentée par l'appelant int compare (objet A, objet B) {// Comparez les éléments A et B et renvoyez la relation de taille}Exemple de fonctions de traitement asynchrones
Par exemple, lorsque nous écrivons une fonction de traitement asynchrone, nous ne savons pas à l'avance ce que les autres développeurs doivent faire lorsque le traitement est terminé, car ces opérations ne peuvent être connues que lors de l'utilisation de la fonction dans un scénario spécifique.
Par conséquent, les développeurs peuvent être tenus de fournir un rappel de fonction de rappel lors de l'utilisation de cette fonction. De cette façon, lorsque nous écrivons des fonctions de traitement asynchrones, nous pouvons appeler la fonction de rappel pour effectuer des travaux finaux sans savoir quel est ces travaux finaux à l'avance.
Le pseudo-code est représenté comme suit:
// Fonction de traitement asynchronisé void asynprocess (Method Rappelback) {// Exécuter Asynchrone Task CallBack ();} // La fonction de rappel spécifique void callback () est implémentée par les opérations de l'appelant {// à effectuer une fois le traitement asynchrone terminé}3. Utilisez l'interface au lieu du rappel de fonction
Nous avons mentionné ci-dessus que la raison pour laquelle le rappel de fonction est utilisé est parce que nous ne connaissons pas la mise en œuvre spécifique de certaines fonctions à l'avance, de sorte que l'implémentation spécifique est laissée aux autres développeurs à compléter.
Pensez-vous que cette phrase semble décrire l'interface Java? Une interface est une définition abstraite d'un ensemble de méthodes, et l'implémentation spécifique est terminée par la classe qui implémente l'interface.
Par conséquent, en utilisant les deux caractéristiques des rappels orientés objet et axés sur l'interface, les rappels de fonction peuvent être remplacés.
Nous donnons les deux exemples ci-dessus pour illustrer comment une interface remplace un rappel de fonction.
Trier les fonctions
En utilisant une interface pour implémenter la fonction de tri, il ne faut plus les développeurs pour fournir la fonction de fonction de rappel lors de l'utilisation de la fonction de tri, mais nécessite que les développeurs s'assurent que les éléments à tri implémentent l'interface comparable. Sur la base de la prémisse que "les éléments à tri ont déjà implémenté l'interface comparable", nous pouvons implémenter la fonction de tri sans savoir que le type d'éléments à tri.
// Fonction générale de tri VOID Sort (objet [] Array) {// Utilisez la méthode comparable de l'interface compareto // Comparez la taille des éléments pour trier le tableau. } // Interface définie par le tri Interface publique Interface comparable {public int compareto (objet autre);} // Implémentation d'interface comparable L'élément de classe publique implémente comparable {@Override public int compareto (objet autre) {// juge la relation de taille actuelle entre l'élément et l'autre // et renvoie la relation entre les deux}}Fonctions de traitement asynchrones
Lorsque vous utilisez des interfaces pour implémenter les fonctions de traitement asynchrones, le développeur ne nécessite pas le rappel de la fonction de rappel, mais nécessite un objet qui implémente l'interface spécifiée, qui reflète bien l'idée axée sur l'objet Java. Par rapport à la fourniture d'une fonction, un objet contient plus d'informations et est plus flexible à utiliser. Mais essentiellement, cette fonction de traitement asynchrone utilise toujours l'interface pour terminer les travaux de finition.
// Fonction de traitement async void asynprocess (ActionListener al) {// Exécuter les tâches asynchrones al.actionperformed ();} // interface définie par la fonction de traitement asynchrone interface publique ActionListener {void Actionperform ();} // implémenter l'interface ActionListener Class Extratask implémente ActionListener {@OverRide Public ActionRoft Lorsque la fonction de traitement asynchrone est terminée}} // appelant la fonction de traitement asynchrone public static void main (String [] args) {asynprocess (new extratask ());}4. Résumé
La méthode de rappel peut être résumé comme: implémentation d'une fonction de fonction générale. Lorsque vous appelez cette fonction générale dans un scénario spécifique, l'appelant doit fournir un rappel de fonction de rappel approprié. Fonction générale Func utilise cette fonction de rappel pour effectuer des tâches dans des scénarios spécifiques.
La façon d'implémenter l'interface est: implémenter une fonction de fonction générale. Lors de l'appel de cette fonction générale dans un scénario spécifique, l'objet en cours de fonctionnement doit implémenter l'interface appropriée en soi. La fonction générale utilisera cette interface pour terminer les tâches dans le scénario spécifique.
L'utilisation de rappels ou d'interfaces de fonction peut résoudre la situation où vous ne connaissez pas l'implémentation spécifique à l'avance. La méthode de rappel de fonction transmet une fonction, tandis que la méthode d'interface transmet un objet qui implémente l'interface.
En Java, les rappels de fonction doivent être achevés à l'aide de mécanismes de réflexion, qui sont sujets aux erreurs et inefficaces. L'utilisation d'interfaces peut rendre la logique du code plus claire, plus efficace et plus facile à déboguer.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.