Maison > Java > javaDidacticiel > Parlons à nouveau de la fonction de rappel Java

Parlons à nouveau de la fonction de rappel Java

高洛峰
Libérer: 2017-01-24 13:41:19
original
1049 Les gens l'ont consulté

J'ai de nouveau rencontré une fonction de rappel, et cette fois j'ai l'intention de l'écrire et de la partager.

La fonction dite de rappel, ou méthode de rappel en langage orienté objet, pour faire simple, est une fonction qui est rappelée à un certain moment (un événement se produit).

Pour être plus détaillé : une fonction A, en tant que paramètre, est transmise à une autre fonction B, puis appelée par B à un certain moment.

Vous avez peut-être des questions ici. Puisqu'une fonction appelle une autre fonction, elle peut être appelée dans le corps de la fonction. Pourquoi devez-vous transmettre la fonction en tant que paramètre à une autre fonction pour être appelée ? certains langages (comme Java) ne prennent pas en charge les fonctions en tant que paramètres.

Oui, vous pouvez en effet appeler une autre fonction dans le corps de la fonction. Il ne semble y avoir aucune différence de fonction, mais il y a un problème ici, c'est-à-dire que la fonction que vous souhaitez appeler est codée en dur, ce qui est codé en dur. signifie que cette fonction B ne peut appeler que la fonction A, et si, dans un autre scénario, il existe une fonction C différente de A et qui doit être appelée à un certain moment dans B.

Continuons à parler de la fonction de rappel. En c/c, la fonction de rappel peut être appelée par une autre fonction en utilisant un pointeur de fonction comme paramètre en c#, vous pouvez utiliser un délégué. méthode, il existe une clé d'événement. En python et javascript, vous pouvez passer directement des fonctions en tant que paramètres d'objet. Ces langages sont faciles à implémenter des fonctions de rappel (méthodes), mais qu'en est-il de Java, laissez-moi d'abord m'éloigner du sujet. C#, je n'aime plus Java. J'avais prévu de ne plus utiliser Java à l'avenir, mais la réalité n'est pas si idéale. Maintenant, je veux créer Android, donc je ne peux toujours pas abandonner Java. J'ai rencontré le problème de cette fonction de rappel, que j'ai également rencontré depuis Java. Je pense personnellement que les langages qui apparaissent dans ce blog, à l'exception de Java, peuvent tous implémenter des rappels de manière simple et compréhensible. c'est le cas avec Java, sinon je n'écrirais pas ce blog.

D'accord, continuons à parler de l'implémentation des méthodes de rappel en Java. Ce blog se concentre sur Java. En Java, les méthodes de rappel sont implémentées en empruntant des interfaces. J'ai trouvé une phrase sur Internet :

"Attribuez la référence de l'objet créé par la classe qui implémente une certaine interface à la variable d'interface déclarée par l'interface. , alors la variable d'interface peut appeler la méthode de l'interface implémentée."
C'est très déroutant, laissez-moi vous expliquer brièvement :
Il y a une interface, et il y a une méthode dans l'interface (cette méthode est la méthode à rappeler) :

interface CallBackInterface {
  void callBackMethod();
}
Copier après la connexion

Nous le savons, l'objet interface ne peut pas être utilisé directement car aucune des méthodes qu'il contient n'est implémentée. Trouvez donc une classe pour implémenter cette interface.
Alors maintenant, ajoutez une classe pour implémenter cette interface :

interface CallBackInterface {
  void callBackMethod();
}
 
class CallBackClass implements CallBackInterface{
 
  @Override
  public void callBackMethod() {
    System.out.println("hello");
  }
}
Copier après la connexion

Bon, la dernière étape : attribuer l'objet de la classe qui implémente l'interface aux variables d'interface déclarées (je les ai écrites dans une méthode, puis j'ai ajouté un shell de classe à l'extérieur) :

public class CallBackTest {
 
  interface CallBackInterface {
    void callBackMethod();
  }
 
  class CallBackClass implements CallBackInterface {
 
    @Override
    public void callBackMethod() {
      System.out.println("hello");
    }
  }
 
  public void showCallBack() {
    CallBackInterface itfs = new CallBackClass();
    itfs.callBackMethod();
  }
}
Copier après la connexion

Vous pouvez maintenant appeler le test Je l'ai essayé :

public class Test {
  public static void main(String[] args) {
    new CallBackTest().showCallBack();
  }
}
Copier après la connexion

S'il n'y a pas de surprises, bonjour sera sorti avec succès, de toute façon, il est de mon côté.

J'ai fini de lire l'exemple, donc laissez-moi vous dire ce que j'ai fait. Quoi ? Pour être plus précis, nous avons une méthode qui doit être appelée dans une certaine méthode (cette méthode est la méthode de rappel, comme nous l'avons dit précédemment, il est préférable de ne pas écrire directement quoi). vous voulez que la méthode de rappel fasse directement dans la méthode d'appel, et comme les méthodes ne peuvent pas être passées en paramètres en Java, nous devons mettre cette méthode de rappel dans l'interface (pourquoi pas une classe ? Pas une classe abstraite ? Mais une interface ? Vous pouvez rechercher vous-même des classes abstraites et des interfaces (similitudes et différences, résoudre ce problème vous-même). S'il existe une interface, elle doit être implémentée par la classe. Ensuite, tant que l'objet de l'interface se voit attribuer un objet de la classe d'implémentation, l'objet de cette interface peut appeler cette méthode. Pour comprendre cela, un point important est le polymorphisme.La connaissance polymorphe utilisée ici est que l'objet de l'interface peut être attribué avec succès par une sous-classe et que la méthode surchargée de la sous-classe peut être appelée (les classes ont également des concepts similaires).

Encore une chose, toute classe ici qui implémente l'interface CallbackInterface peut être placée après new comme suit (c'est-à-dire une affectation) :

public class CallBackTest {
  interface CallBackInterface {
    void callBackMethod();
  }
 
  class CallBackClass implements CallBackInterface {
 
    @Override
    public void callBackMethod() {
      System.out.println("hello");
    }
  }
 
  class Controller {
    private CallBackInterface cbitf;
    // 这个boolean只是为了模拟有事件,没啥实用价值
    public boolean somethingHappend;
    // 这里确实可以直接把CallBackClass做参数,而且省掉接口的定义
    // 但是这样做的话,就像是回调函数直接写在了调用函数里一样
    // 不明白的话就好好理解下"约定"和"调用者不管回调函数是怎么实现的"吧
    public Controller(CallBackInterface itfs) {
      somethingHappend = true;
      this.cbitf = itfs;
    }
 
    public void doSomething() {
      if(somethingHappend) {
        cbitf.callBackMethod();
      }
    }
  }
 
  public void showCallBack() {
    CallBackClass cbc = new CallBackClass();
    Controller ctrlr = new Controller(cbc);
    ctrlr.doSomething();
    // 其实上面也可以这样写在一行里
    // new Controller(new CallBackClass()).doSomething();
  }
}
Copier après la connexion

Enfin, encore une chose. En fait, ce genre d'application est souvent rencontré sous Android. Je l'ai rencontré lorsque j'apprenais Android.

Ce qui précède est ma compréhension personnelle et mon utilisation des fonctions de rappel. J'espère que vous l'aimerez tous.

Pour plus d'articles liés aux fonctions de rappel Java, veuillez faire attention au site Web PHP 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