Maison > Java > javaDidacticiel > le corps du texte

Exemple d'explication de l'utilisation de classes anonymes pour implémenter des fonctions de rappel en Java

黄舟
Libérer: 2017-08-22 10:10:45
original
1608 Les gens l'ont consulté

Cet article présente principalement des exemples d'implémentation de fonctions de rappel par Java via des classes anonymes. La fonction de rappel est une spécification d'une signature de fonction (plusieurs paramètres d'entrée, un paramètre de sortie). Bien qu'il n'y ait pas de déclaration de fonction en Java, Java peut utiliser des interfaces. pour faire respecter les spécifications. Vous pouvez consulter l'explication détaillée ci-dessous pour les étapes de fonctionnement spécifiques, et les amis intéressés peuvent s'y référer.

En langage C, les noms de fonctions peuvent être transmis sous forme de pointeurs de fonction vers des paramètres formels pour implémenter des rappels


void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
  do_func(f1);
  do_func(f2);
  do_func(f3);
}
Copier après la connexion

En C++11, implémentation des rappels peut également être implémenté via des modèles de fonction et des expressions lambda


template <typename Func>
void do_func(Func f) { f(); }
int main()
{
  do_func([]() { printf("f1()"); });
  do_func([]() { printf("f2()"); });
  do_func([]() { printf("f3()"); });
}
Copier après la connexion

Si l'implémentation du code de la fonction de rappel est plus complexe et a une valeur de réutilisation, des expressions lambda telles que The. La solution unique ne convient pas. Avant C++11, elle était implémentée via des objets fonction. Pour parler franchement, un objet fonction est un objet ordinaire d'une classe, mais C++ peut surcharger l'opérateur crochet, de sorte qu'appeler la méthode Operator() d'un objet de la classe est aussi naturel que d'appeler une fonction.

En analysant l'essence, en fait, la fonction de rappel est une spécification d'une signature de fonction (plusieurs paramètres d'entrée, un paramètre de sortie). Bien qu'il n'y ait pas de déclaration de fonction en Java, Java peut utiliser des interfaces pour appliquer des spécifications.


interface Funcable {
  void Func();
}
Copier après la connexion

De cette façon, tant que la classe qui implémente l'interface a une fonction membre avec la même signature de fonction que void Func() (enfin, je suis toujours pas habitué aux méthodes) ), il vous suffit donc de passer l'objet de la classe qui implémente l'interface dans la fonction, puis d'appeler la méthode Func() de l'objet dans la fonction


class F1 implements Funcable {

  @Override
  public void Func() {
    System.out.println("f1()");
  } 
}
public class Test {
  
  public static void do_func(Funcable funcable) {
    funcable.Func();
  } 
  public static void main(String[] args) {
    do_func(new F1());
  }
}
Copier après la connexion

Pour économiser la quantité de code ici, les classes F2 et F3 ne seront pas écrites. Et l'utilisation des classes anonymes de Java peut enregistrer du code, similaire aux expressions lambda


  do_func(new Funcable() {      
      @Override
      public void Func() {
        System.out.println("f2()");
      }
    });
Copier après la connexion

En parlant d'expressions lambda, il peut capturer des variables externes de cette façon. capturer explicitement les variables externes via des constructeurs anonymes


  String msg = "f3()";
    do_func(new Funcable() {
      String _msg; 
      {
        _msg = msg;
      } 
      @Override
      public void Func() {
        System.out.println(_msg);
      }
    });
Copier après la connexion

Cette approche est très similaire aux expressions lambda, car les classes anonymes Le constructeur anonyme ne peut prendre que des variables externes comme paramètres de construction, ce qui équivaut à la "capture" de l'expression lambda. La méthode d'écriture correspondante de l'expression lambda en C++ est


 std::string msg = "f3()";
  do_func([&msg]() { std::cout << msg << std::endl; });
Copier après la connexion

Java8 a également des expressions lambda, elle peut donc être écrite. comme ça

do_func(() -> { System.out.println(msg); });
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal