lambdajクロージャーで使用されているJavaメカニズム
-
06-07-2019 - |
質問
Lamdbajを使用すると、Java言語でクロージャーを定義できます。さまざまな例があります。 こちら
たとえば、 println
クロージャを定義するために使用されている基礎となるJavaメカニズムに関する質問です。次のコードが使用されます。
Closure println = closure();
{ of(System.out).println(var(String.class)); }
このクロージャは、次の方法で実行できます。
println.apply("foobar");
Javaのどのメカニズムが of(...)。println(...)
の呼び出しを println
に関連付けることができるかについて興味がありますインスタンス自体。
当然、lambdajのソースコードは読むことができますが、誰かが持っている場合は少し高いレベルの説明を期待していました。私のリフレクションスキルは、少し内省し、メソッドを動的に実行します。
解決
まあ、 of
はおそらく静的にインポートされる static
メソッドであり、クラス名を囲むことなく呼び出すことができます。 var
は同じだと思います。両方のメソッドは、後で呼び出されるメソッドを持つ何らかのタイプを返す必要があります。
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);
}
}
突然:
Fac.of(System.out).println(Fac.var(String.class));
有効なJavaです。静的インポートを使用して、ちょっと:
import static Fac.*;
of(System.out).println(var(String.class));
中かっこは明らかに有効なJavaです。これらのメソッドを任意のメソッドに追加して、字句の定義を支援することができます。このAPI設計スタイルは fluent と呼ばれ、 JMock テストライブラリ。
ところで、これがJavaにクロージャを導入することになっている場合、それは非常にばかげています-構文は読みにくいほどひどいです。彼らのI / Oの例は実際に私を大声で笑わせました。 Scala をお試しください!
EDIT -2つの println
呼び出しが関連付けられています。最初の呼び出しシーケンスでは、ライブラリがパラメーターとして渡した変数をキャプチャできるためです。これらはおそらく ThreadLocal
構造にキャプチャされます。その後、(おそらく静的な) println
メソッドを呼び出すと、ライブラリはこのキャプチャされたデータを使用して、後で動作を実際に実行します。また、テストに関連して、EasyMockテストフレームワークは同様のメカニズム(バックグラウンドでJavaプロキシを使用)を使用して、期待値をキャプチャします。
他のヒント
私はマリオ・フスコであり、lambdajライブラリのメイン開発者です。
まず、何か明確にしたいことがあります:lambdajは関数型言語を置き換えるものではありません。先週チューリッヒの水差しでのスピーチで言ったように、もしScalaを使用する機会があれば、ぜひScalaを使ってみてください。ここでは、私のスピーチの履歴書を見つけることができます。
http://ctpjava.blogspot.com/ 2009/10 / lambdaj-new-trends-in-java.html
私も幸せなScala開発者です。しかし、Javaで開発する義務がある場合があります(私の経験では、現実の世界では、コードを記述する必要がある言語の約80%を選択することはできません)。この場合、lambdaj機能の一部は役立つ(またはそう願っています)。私はJavaに完全に欠けているいくつかの機能的な機能を持ち込みたかっただけです。もちろん、主にJava自体によって課せられた制限のため、結果は完全に満足のいくものではありません。
内部lambdajメカニズムに関しては、はい、その結果を達成するためにThreadLocalを使用します。 lambdajに関する他の質問、好奇心、またはより良い提案や建設的な批評がある場合は、ここでlambdajメーリングリストに登録してください:
http://groups.google.com/group/lambdaj
バイ マリオ