6

Lamdbaj を使用すると、Java 言語でクロージャを定義できます。さまざまな例が ここにあります。

私の質問は、たとえば、printlnクロージャーを定義するために使用されている基礎となる Java メカニズムに関するもので、次のコードが使用されます。

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

このクロージャーは、次の方法で実行できます。

println.apply("foobar");

Java のどのメカニズムにより、呼び出しがインスタンス自体of(...).println(...)に関連付けられるようになるのか、興味があります。println

当然、lambdaj のソース コードは読むことができますが、誰かが持っている場合は、もう少しレベルの高い説明を期待していました。私のリフレクション スキルは、ちょっとしたイントロスペクションとメソッドの動的実行にまで及びます。

4

2 に答える 2

10

私は Mario Fusco で、lambdaj ライブラリの主な開発者です。

まず、明確にしたいことがあります。ラムダジは、関数型言語を置き換えることを意図したものではありません。先週、チューリッヒのジャグでのスピーチで言ったように、Scala を使う機会があれば、それを試してみて、決して振り返ってはいけません。ここに私のスピーチの履歴書があります。そこでは、次のことが明確に述べられています。

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

私も幸せな Scala 開発者です。しかし、Java で開発しなければならない場合もあります (私の経験では、現実の世界では、約 80% の場合、コードを記述する言語を選択することはできません)。この場合、ラムダジ機能の一部は役に立ちます(またはそう願っています)。完全に欠落しているいくつかの機能を Java に導入したかっただけです。もちろん、結果は完全に満足できるものではありません。これは主に、Java 自体によって課せられた制限によるものです。

内部ラムダジ メカニズムに関しては、はい、その結果を達成するために ThreadLocal を使用します。lambdaj に関する他の質問、好奇心、またはさらに良い提案や建設的な批評がある場合は、こちらの lambdaj メーリング リストに登録してみてください。

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

さようならマリオ

于 2009-10-24T11:32:47.277 に答える
2

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 であり、これらを任意のメソッドに追加して字句 sope を定義するのに役立てることができます。この API 設計スタイルは流暢と呼ばれ、 JMockテスト ライブラリによって最もよく示されます。

ところで、これが Java にクロージャーを導入することになっているとしたら、それはまったくばかげています。彼らの I/O の例は、実際に私を大笑いさせました。スカラを試してみてください!

EDIT - 2 つのprintln呼び出しが関連付けられていると思います。これは、呼び出しの最初のシーケンスにより、ライブラリがパラメーターとして渡した変数をキャプチャできるためです。これらはおそらく何らかのThreadLocal構造に取り込まれています。次に、(おそらく静的な) メソッドを呼び出すとprintln、ライブラリはこのキャプチャされたデータを使用して、後で実際に動作を実行します。テスト関連でも、EasyMock テスト フレームワークは同様のメカニズム (バックグラウンドで Java プロキシを使用) を使用して期待値を取得します。

于 2009-10-23T21:34:16.673 に答える