J'ai implémenté le support de rappel / délégué en Java en utilisant la réflexion. Les détails et la source de travail sont disponibles sur mon site Web .
Comment ça fonctionne
Nous avons une classe principale nommée Callback avec une classe imbriquée nommée WithParms. L'API qui a besoin du rappel prendra un objet Callback comme paramètre et, si nécessaire, créera un Callback.WithParms comme variable de méthode. Comme un grand nombre d'applications de cet objet seront récursives, cela fonctionne très proprement.
Les performances étant toujours une priorité pour moi, je ne voulais pas être obligé de créer un tableau d'objets jetables pour contenir les paramètres de chaque appel - après tout, dans une grande structure de données, il pourrait y avoir des milliers d'éléments, et dans un traitement de message scénario, nous pourrions finir par traiter des milliers de structures de données par seconde.
Afin d'être sûr pour les threads, le tableau de paramètres doit exister de manière unique pour chaque invocation de la méthode API, et pour plus d'efficacité, le même doit être utilisé pour chaque appel du rappel; J'avais besoin d'un deuxième objet qui serait bon marché à créer afin de lier le rappel avec un tableau de paramètres pour l'invocation. Mais, dans certains scénarios, l'invocateur aurait déjà un tableau de paramètres pour d'autres raisons. Pour ces deux raisons, le tableau de paramètres n'appartenait pas à l'objet Callback. Le choix de l'invocation (passer les paramètres sous forme de tableau ou d'objets individuels) appartient également à l'API en utilisant le callback lui permettant d'utiliser l'invocation la mieux adaptée à son fonctionnement interne.
La classe imbriquée WithParms est donc facultative et sert à deux fins, elle contient le tableau d'objets de paramètres nécessaire pour les appels de rappel, et elle fournit 10 méthodes invoke () surchargées (avec de 1 à 10 paramètres) qui chargent le tableau de paramètres, puis appeler la cible de rappel.