Le langage Java a-t-il des fonctions déléguées, similaires à la façon dont C # supporte les délégués?
Réponses
Trop de publicités?Non, pas vraiment.
Vous pouvez être en mesure d'obtenir le même effet en utilisant la réflexion pour obtenir des objets vous pouvez ensuite appeler, et de l'autre façon est de créer une interface avec un seul "appeler" ou "exécuter " méthode", et puis instancier pour appeler la méthode de votre intéresse (c'est à dire à l'aide d'un anonyme intérieur de la classe).
Vous pouvez également les trouver cet article intéressant / utile : Un Programmeur Java Regarde C# Délégués
En fonction précisément ce que vous entendez, vous pouvez obtenir un effet similaire (passant autour d'une méthode) en utilisant le Modèle de Stratégie.
Au lieu d'une ligne comme celle de la déclaration d'une méthode nommée signature:
// C#
public delegate void SomeFunction();
déclarer une interface:
// Java
public interface ISomeBehaviour
{
void SomeFunction();
}
Pour des implémentations concrètes de la méthode, de définir une classe qui implémente le comportement:
// Java
public class TypeABehaviour implements ISomeBehaviour
{
public void SomeFunction()
{
// TypeA behaviour
}
}
public class TypeBBehaviour implements ISomeBehaviour
{
public void SomeFunction()
{
// TypeB behaviour
}
}
Alors, où que vous auriez eu un SomeFunction
délégué en C#, utilisez un ISomeBehaviour
de référence à la place:
// C#
SomeFunction doSomething = someMethod;
doSomething();
doSomething = someOtherMethod;
doSomething();
// Java
ISomeBehaviour someBehaviour = new TypeABehaviour();
someBehaviour.SomeFunction();
someBehaviour = new TypeBBehaviour();
someBehaviour.SomeFunction();
Avez-vous lu ceci :
Les délégués sont utiles pour construire dans les systèmes basés sur des événements. Essentiellement Les délégués sont des objets qui codent pour une méthode d'expédition spécifié objet. Ce document montre comment java les classes internes offrent une plus générique de la solution à de tels problèmes.
Qu'est ce qu'un Délégué? Vraiment il est très similaire à un pointeur sur un membre la fonction utilisée en C++. Mais un délégué contient l'objet cible alongwith la méthode à appeler. Idéalement, il serait agréable d'être en mesure de dire:
obj.registerHandler(ano.methodOne);
..et que la méthode methodOne serait appelé ano lorsque certaines événement a été reçu.
C'est ce que le Délégué de la structure atteint.
Java Les Classes Internes
Il a été soutenu que Java fournit ce des fonctionnalités en passant par les classes internes et n'a donc pas besoin supplémentaire Délégué de construire.
obj.registerHandler(new Handler() {
public void handleIt(Event ev) {
methodOne(ev);
}
} );
À première vue, cela semble correct, mais en même temps une nuisance. Parce que, pour de nombreux exemples de traitement des événements de la simplicité de la Les délégués de la syntaxe est très attrayant.
Général Gestionnaire
Toutefois, si l'événement-en fonction de programmation est utilisé dans un plus omniprésente manière, disons, par exemple, en tant que partie d'un général la programmation asynchrone, il n'y a plus en jeu.
Dans une telle situation générale, il n'est pas suffisant pour inclure uniquement les cible de la méthode et de l'objet cible de l'instance. En général, il peut être les autres paramètres requis, qui sont déterminées dans le contexte lors de l' le gestionnaire d'événement est enregistré.
Dans cette situation plus générale, la java approche peut fournir une très solution élégante, en particulier lorsqu'il est combiné avec l'utilisation de finale variables:
void processState(final T1 p1, final T2 dispatch) {
final int a1 = someCalculation();
m_obj.registerHandler(new Handler() {
public void handleIt(Event ev) {
dispatch.methodOne(a1, ev, p1);
}
} );
}
finale * *
Obtenu votre attention?
Notez que la dernière variables sont accessibles à partir de l'anonyme méthode de la classe de définitions. Assurez-vous d'étudier ce code avec soin pour comprendre les ramifications. C'est potentiellement très puissante technique. Par exemple, il peut être utilisé à bon escient lors de l'inscription les gestionnaires d'MiniDOM et dans des situations plus générales.
En revanche, le Délégué de construire n'est pas une solution pour cette exigence plus générale, et en tant que tel, doit être rejetée comme une l'idiome sur les conceptions peuvent être fondées.
Je sais que ce post est ancien, mais Java 8 a ajouté lambdas, et le concept d'une interface fonctionnelle, qui est une interface avec une seule méthode. Ensemble, ils offrent des fonctionnalités similaires aux délégués C #. Voir ici pour plus d'informations, ou juste google Java Lambdas. http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html