218 votes

Délégués Java?

Le langage Java a-t-il des fonctions déléguées, similaires à la façon dont C # supporte les délégués?

165voto

Matt Sheppard Points 32256

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

73voto

Sahuagin Points 3209

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();

37voto

Patrick Points 20392

Petite histoire: non .

20voto

Michael Points 101

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.

13voto

user3311658 Points 21

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X