Astuce Java 10: implémentez des routines de rappel en Java

Les développeurs qui connaissent le modèle de programmation événementielle de MS-Windows et du système X Window sont habitués à transmettre des pointeurs de fonction qui sont appelés (c'est-à-dire «rappelés») lorsque quelque chose se produit. Le modèle orienté objet de Java ne prend actuellement pas en charge les pointeurs de méthode et semble donc empêcher l'utilisation de ce mécanisme confortable. Mais tout n'est pas perdu!

La prise en charge des interfaces par Java fournit un mécanisme par lequel nous pouvons obtenir l'équivalent des rappels. L'astuce consiste à définir une interface simple qui déclare la méthode que nous souhaitons invoquer.

Par exemple, supposons que nous souhaitons être notifiés lorsqu'un événement se produit. On peut définir une interface:

public interface InterestingEvent {// Ceci est juste une méthode régulière donc elle peut renvoyer quelque chose ou // prendre des arguments si vous le souhaitez. public void intéressantEvent (); }

Cela nous donne une emprise sur tous les objets des classes qui implémentent l'interface. Ainsi, nous n'avons pas besoin de nous préoccuper d'autres informations de type superflues. C'est beaucoup plus agréable que de pirater des fonctions C de trampoline qui utilisent le champ de données des widgets pour contenir un pointeur d'objet lors de l'utilisation de code C ++ avec Motif.

La classe qui signalera l'événement doit s'attendre à des objets qui implémentent l' interface InterestingEvent , puis invoquer la méthode interestEvent () selon le cas.

public class EventNotifier {private InterestingEvent ie; private boolean somethingHappened; public EventNotifier (InterestingEvent event) {// Enregistrez l'objet événement pour une utilisation ultérieure. ie = événement; // Rien à signaler pour le moment. quelque choseHappened = faux; } // ... public void doWork () {// Vérifier le prédicat, qui est défini ailleurs. if (somethingHappened) {// Signalez le pair en invoquant la méthode de l'interface. ie.interestingEvent (); } // ...} // ...}

Dans cet exemple, j'ai utilisé le prédicat somethingHappened pour savoir si l'événement doit être déclenché ou non. Dans de nombreux cas, le simple fait que la méthode ait été appelée suffit à justifier la signalisation de la fonction interestEvent () .

Le code qui souhaite recevoir la notification d'événement doit implémenter l' interface InterestingEvent et simplement passer une référence à lui-même au notificateur d'événement.

La classe publique CallMe implémente InterestingEvent {Private EventNotifier en; public CallMe () {// Crée le notificateur d'événement et passe-lui-même à lui. en = new EventNotifier (this); } // Définit le gestionnaire réel de l'événement. public void intéressantEvent () {// Wow! Quelque chose de vraiment intéressant a dû se produire! // Faire quelque chose... } //... }

C'est tout ce qu'on peut en dire. J'espère que l'utilisation de cet idiome Java simple rendra votre transition vers Java un peu moins instable.

Subsistant sur la caféine, le sucre et trop peu de sommeil, John D. Mitchell a été consultant pendant la plupart des neuf dernières années, et a développé un logiciel PDA en langage d'assemblage OO chez Geoworks. Il finance sa dépendance à Java en écrivant des compilateurs, des systèmes Tcl / Tk, C ++ et Java. Il a co-écrit le nouveau livre sur Java Making Sense of Java et développe actuellement un compilateur Java.

Cette histoire, "Astuce Java 10: Implémenter des routines de rappel en Java" a été publiée à l'origine par JavaWorld.