Frage

Lamdbaj die Definition von Schließungen in der Java-Sprache erlaubt, können verschiedene Beispiele finden hier

Meine Frage der zugrunde liegenden Java-Mechanismen bei Verwendung in Bezug auf zum Beispiel der println Schließung zu definieren, wird der folgende Code verwendet:

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

Dieser Verschluss kann anschließend über ausgeführt werden:

println.apply("foobar");

Ich bin gespannt, welche Mechanismen in Java dem Anruf erlauben würden, of(...).println(...) mit der println Instanz selbst verbunden zu werden.

Natürlich ist die lambdaj Quellcode zu lesen, aber ich hatte gehofft, für eine etwas höheres Niveau Erklärung, wenn jemand eine hat. Mein Spiegel Fähigkeit so weit gehen, als ein wenig Selbstbeobachtung und Ausführen von Methoden dynamisch.

War es hilfreich?

Lösung

Nun, of ist vermutlich eine static Methode, die statisch importiert wird, so kann es ohne die umgebende Klasse Namen genannt werden. Ich gehe davon aus, dass var gleich ist. Beiden Methoden müssen eine Art Rückkehr, die die Verfahren anschließend mit dem Namen:

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

} 

Ganz plötzlich:

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

Ist gültig Java. Die Verwendung von statischen Importen, schwupps:

import static Fac.*;

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

Die geschweiften Klammern-sind offensichtlich gültige Java, wie Sie diese in einem beliebigen Verfahren hinzufügen können bei der Definition eine lexikalische sope zu unterstützen. Diese API-Design-Stil ist fließend und wird am besten präsentiert von die JMock Test Bibliothek.

Durch die Art und Weise, wenn dies soll Schließungen Java einzuführen, es ist ziemlich lächerlich - die Syntax ist unreadably schrecklich . Ihre I / O Beispiel hat mich wirklich laut lachen. Versuchen Sie Scala

Bearbeiten - die beiden println Anrufe zugeordnet sind, glaube ich, weil die erste Folge von Aufrufen der Bibliothek erlauben, die Variablen zu erfassen, die Sie als Parameter übergeben haben. Diese werden wahrscheinlich in einigen ThreadLocal Struktur gefangen. Wenn Sie dann eine (vermutlich auch statisch) println Methode aufrufen, wird die Bibliothek dieses erfassten Daten mit, um tatsächlich das Verhalten zu einem späteren Zeitpunkt ausführen. Auch Testen verwendet, das EasyMock Test-Framework verwendet einen ähnlichen Mechanismus (die Java-Proxies im Hintergrund verwendet) erwartete Werte zu erfassen.

Andere Tipps

Ich bin Mario Fusco und ich bin der Hauptentwickler der lambdaj Bibliothek.

Zunächst einmal möchte Ich mag etwas klarstellen: lambdaj soll keine funktionale Sprache ersetzen. Wie ich am Krug Zürich in meiner Rede letzte Woche gesagt, wenn Sie eine Chance zu nutzen Scala haben, denn sie gehen und nie wieder sehen. Hier können Sie einen Lebenslauf meiner Rede finden, wo es klar gesagt wird, dass:

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

Ich bin ein glücklich zu Scala Entwickler. Aber manchmal sind verpflichtet, die Sie gerade in Java (in meiner Erfahrung in der realen Welt, über die 80% der Zeit können Sie nicht in wählen, welche Sprache Sie haben Ihren Code zu schreiben) zu entwickeln und in diesem Fall einige der lambdaj Merkmale könnten hilfreich (oder hoffentlich). Ich wollte nur einige funktionale Eigenschaften zu Java bringen, die völlig fehlen. Natürlich ist das Ergebnis nicht vollständig befriedigend ist vor allem aufgrund der Begrenzung durch Java auferlegten selbst.

Wie für den internen lambdaj Mechanismus, ja es wird einen Thread, um dieses Ergebnis zu erzielen. Wenn Sie weitere Fragen haben, Kuriositäten oder sogar bessere Vorschläge und konstruktive Kritik über lambdaj vielleicht könnten Sie interessieren sich hier auf die lambdaj Mailing-Liste zu registrieren:

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

Bye Mario

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top