在lambdaj闭包中使用的Java机制

时间:2009-10-23 21:19:16

标签: java reflection closures lambdaj

Lamdbaj允许在Java语言中定义闭包,可以找到各种示例 here

我的问题是关于使用的底层Java机制,例如,定义println闭包,使用以下代码:

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

此闭包可以随后通过以下方式执行:

println.apply("foobar");

我很好奇Java中的哪些机制允许调用of(...).println(...)println实例本身相关联。

当然,lambdaj源代码可供阅读,但我希望有更高级别的解释,如果有人有。我的反思技巧可以动态地进行一些内省和执行方法。

2 个答案:

答案 0 :(得分:10)

我是Mario Fusco,我是lambdaj库的主要开发者。

首先,我想澄清一下:lambdaj并不是要取代任何功能语言。正如我上周在苏黎世Jug演讲中所说,如果你有机会使用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

再见 马里奥

答案 1 :(得分: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。使用静态导入,嘿presto:

import static Fac.*;

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

花括号显然是有效的Java,因为您可以在任何方法中添加这些以帮助定义词汇sope。此API设计样式称为fluent,最好由JMock测试库展示。

顺便说一句,如果这应该为Java引入闭包,那就太荒谬了 - 语法难以置信的。他们的I / O例子实际上让我大笑。尝试 Scala

编辑 - 两个println调用相关联我相信,因为第一个调用序列允许库捕获您作为参数传入的变量。这些可能是在某些ThreadLocal结构中捕获的。然后,当您调用(也可能是静态的)println方法时,库正在使用此捕获的数据实际执行稍后的行为。同样测试相关,EasyMock测试框架使用类似的机制(在后台使用Java代理)来捕获预期值。