8
votes

Fermeture et rappel

Y a-t-il une autre manière en Java pour mettre en œuvre des rappels à des classes intérieures? Quelle est la différence entre les rappels et les fermetures?


0 commentaires

9 Réponses :


0
votes

Je ne pense pas.

S'il y a, il est probablement inférieur en quelque sorte, sinon les classes intérieures anonymes ne seraient pas largement utilisées.


0 commentaires

0
votes

Il n'y a pas de différence.

Les fermetures peuvent être définies comme un bloc de code tenant le contexte parent qui peut être exécuté facilement.

En fait, la seule différence que je connaisse entre celles-ci est la facilité d'écriture. Une fermeture typiquement groovy / ruby ​​est en effet plus petite à écrire qu'une classe Java anonyme.

Cependant, en considérant Java Framworks comme GUAVA et il y a une utilisation libérale de classes anonymes / Interfaces, en particulier pour les fermetures typiques Utilisez des cas tels que Filtre (comparer avec Groovy's Mise en œuvre ), je peux dire qu'il n'y a absolument aucune différence de conception.


1 commentaires

S'il n'y a pas de différence, pourquoi ces deux noms existent. Je suis désemparé



0
votes

Malheureusement, la seule manière raisonnable est la seule classe intérieure / anonyme.

Vous pouvez également le faire avec une réflexion, mais cela est généralement plus lent et plus difficile dans la maintenance (pas de surbrillance de la syntaxe, difficile à trouver des références dans l'IDE, etc.). Un exemple: xxx


0 commentaires

10
votes

La fermeture est la façon dont vous le construisez, rappel est comment vous l'utilisez.

Un rappel peut être mis en œuvre comme une fermeture (dans des langues qui les possèdent) ou une implémentation d'une interface (en Java, en tant que classe interne anonyme ou une classe normale).

Callback signifie que vous transmettez un morceau de code à une fonction, de sorte que la fonction puisse appeler ce morceau de code plus tard. C'est un type particulier de paramètre.

Le morceau de code peut être un pointeur de fonction ou une fermeture ou un objet avec des méthodes bien connues, en fonction de l'offre de la langue.


1 commentaires

C'était la réponse que j'essayais d'écrire quand Neeraj a chuté la question mais ne pouvait pas sortir de manière cohérente. Gloire.



0
votes

Pour les classes anonymes actuelles constituent la meilleure façon de gérer des rappels dans Java. Cependant, cela risque de changer Java 7, qui mettra en œuvre des fermetures. http://fr.wikipedia.org/wiki/closure_(Computer_science) < / p>


0 commentaires

1
votes

Un rappel est juste n'importe quel code exécutable qui est transmis comme paramètre à un autre code. En usage fréquent, ce code exécutable est une fermeture, mais ce n'est pas nécessairement.

Le mot fermeture est quelque peu abusé et beaucoup de gens l'utilisent simplement comme synonyme de "fonction anonyme", mais au moins Selon Wikipedia , c'est une mauvaise utilisation du terme. L'article Wikipedia explique cela mieux que je ne peux faire rapidement.


0 commentaires

5
votes

Les fermetures et les classes intérieures anonymes (et autres) peuvent être utilisées comme rappels. A Callback n'est que du code qui est transmis comme un argument à un autre code.

Une grande différence de fermetures, comparées aux classes intérieures anonymes de Java, est que (en langues impératives) une fermeture peut modifier les variables de la portée environnante. Wikipedia donne l'exemple suivant: P>

var f, g;
function foo() {
  var x = 0;
  f = function() { return ++x; };
  g = function() { return --x; };
  x = 1;
  alert('inside foo, call to f(): ' + f()); // "2"
}
foo();
alert('call to g(): ' + g()); // "1"
alert('call to f(): ' + f()); // "2"


2 commentaires

Bien que cela puisse être émulé par final objref x = nouveau objref (0); avec objref implémenté comme référence mutable.


En fait, Scala fait quelque chose comme ça pour mettre en œuvre des fermetures sur la JVM, car JVM (et Java) ne les supporte pas de manière native.



1
votes

Si vous avez besoin de fermetures à Java, vous pouvez essayer Lambdaj . ici Vous pouvez voir comment il permet de définir des fermetures à travers une DSL très simple.


1 commentaires

En fait, Lambdaj ne supporte pas la création de fermetures. Au mieux, il soutient la création de certaines sortes d'expressions Lambda qui ne sont pas des fermetures.



0
votes

Voici deux implémentations qui utilisent des fermetures et des rappels.

  • http: //www.caglargonul .COM / 2013/04/05 / Lecture avec fermetures-in-Java-7 / li>
  • http://www.caglargonul.com/2013/04 / 05 / Java7-Callback-Mise en œuvre / LI> ul>

    et voici un meilleur exemple (peut être trouvé ici http://www.caglargonul.com/2013/04/10/is-it-really-a-closure-yes-it-is/ ) pour comprendre quelle fermeture est. La clé est que p>

    Une fermeture est livrée avec un environnement de référencement non seulement un code de fonction. P> blockQuote>

    Le meilleur moyen d'implémenter une fermeture en Java 7 et ci-dessous utilise une interface. Dans cet exemple, un rappel est mis en œuvre comme fermeture. p>

    Vous déclarez d'abord votre interface qui détiendra votre fermeture. p> xxx pré>

    et permettra d'ajouter une classe responsable de la tenue d'une gamme de fermetures, deux méthodes publiques pour Ajout et suppression de la fermeture et une fonction publique qui appellera les fonctions à l'intérieur des fermetures lorsqu'un événement se produit. p> xxx pré>

    et voici la partie magique. Voir l'environnement de référencement en action. P> xxx pré>

    ci-dessus lorsque nous déclarons CB1, nous ajoutons un environnement de référencement composé de la variable x. Lorsque nous appelons la fonction dans cette fermeture, nous incrémentez cette variable par une. Si c'était une fonction normale, X aurait été déclaré comme 1 lorsque nous appelons la fonction. Mais ce n'est pas une fonction normale. C'est une fermeture. Donc, X n'est pas déclaré chaque fois que nous appelons la fonction de la fermeture. Comme vous pouvez le constater à partir de la sortie chaque fois que nous l'appelons, X incrémente. P>

    You register this callback 1 time/times
    You register this callback 2 time/times
    


0 commentaires