Question

Lamdbaj permet la définition de fermetures en langage Java. Plusieurs exemples peuvent être trouvés. ici

Ma question concerne les mécanismes Java sous-jacents utilisés, par exemple pour définir la fermeture println . Le code suivant est utilisé:

Closure println = closure(); 
{ of(System.out).println(var(String.class)); }

Cette fermeture peut être exécutée ultérieurement via:

println.apply("foobar");

Je suis curieux de savoir quels mécanismes en Java permettraient à l'appel de de (...). println (...) d'être associé au println exemple lui-même.

Naturellement, le code source de lambdaj est disponible pour la lecture, mais j’espérais une explication de niveau légèrement supérieure si quelqu'un en avait une. Mes compétences de réflexion vont jusqu’à un peu d’introspection et à l’exécution dynamique de méthodes.

Était-ce utile?

La solution

Eh bien, de est vraisemblablement une méthode statique qui est importée de manière statique afin de pouvoir être appelée sans le nom de classe englobant. Je pense que var est identique. Les deux méthodes doivent renvoyer un type dont les méthodes sont ensuite appelées:

public class Printable {
  public void println(Var var);
}

public class Fac {
  public static Printable of(Object o) {
    return new Printable(o);
  }

  public static Var var(Class<?> clazz) {
    return new Var(clazz);
  }

} 

Tout d'un coup:

Fac.of(System.out).println(Fac.var(String.class));

Est valide Java. En utilisant les importations statiques, hop:

import static Fac.*;

of(System.out).println(var(String.class));

Les accolades sont évidemment des expressions Java valides, que vous pouvez ajouter à n’importe quelle méthode pour vous aider à définir un sope lexical. Ce style de conception d'API s'appelle fluent et est présenté de manière optimale par la bibliothèque de tests JMock .

Soit dit en passant, si cela est censé introduire des fermetures dans Java, c'est assez ridicule - la syntaxe est incroyablement horrible . Leur exemple I / O m'a fait rire aux éclats. Essayez Scala !

MODIFIER - les deux appels println sont associés, je crois, car la première séquence d'appels permet à la bibliothèque de capturer les variables que vous avez transmises en tant que paramètres. Celles-ci sont probablement capturées dans une structure ThreadLocal . Lorsque vous appelez ensuite une méthode (également supposée statique) println , la bibliothèque utilise ces données capturées pour exécuter le comportement ultérieurement. Également lié aux tests, le cadre de test EasyMock utilise un mécanisme similaire (qui utilise des mandataires Java en arrière-plan) pour capturer les valeurs attendues.

Autres conseils

Je suis Mario Fusco et je suis le principal développeur de la bibliothèque lambdaj.

Tout d’abord, je voudrais préciser quelque chose: le lambdaj n’est pas destiné à remplacer un langage fonctionnel. Comme je l'ai dit la semaine dernière dans mon discours au Jug of Zurich, si vous avez la possibilité d'utiliser Scala, allez-y et ne regardez jamais en arrière. Vous trouverez ici un résumé de mon discours dans lequel il est clairement indiqué que:

http://ctpjava.blogspot.com/ 2009/10 / lambdaj-new-trends-in-java.html

Je suis aussi un heureux développeur Scala. Mais parfois, vous êtes simplement obligé de vous développer en Java (selon mon expérience, dans le monde réel, environ 80% des fois où vous ne pouvez pas choisir la langue dans laquelle vous écrivez votre code) et dans ce cas, certaines des fonctionnalités de lambdaj pourraient être: serviable (ou j'espère). Je voulais juste apporter à Java des fonctionnalités qui manquent totalement. Bien entendu, le résultat n’est pas complètement satisfaisant, principalement en raison de la limitation imposée par Java lui-même.

En ce qui concerne le mécanisme interne lambdaj, oui, il utilise un ThreadLocal afin d’atteindre ce résultat. Si vous avez d'autres questions, des curiosités ou même de meilleures suggestions et des critiques constructives à propos de lambdaj, vous voudrez peut-être vous inscrire à la liste de diffusion de lambdaj ici:

http://groups.google.com/group/lambdaj

Au revoir Mario

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top