2014-02-20 17 views
9

enter image description hereGroovy的 - 封VS方法 - 区别

如果你仔细看,在包括图片,你会发现,你可以使用Eclipse IDE重构Groovy代码和方法转换为闭合,反之亦然。那么,封闭又是什么?它与方法有什么不同?有人能给出一个使用闭包的好例子,以及为什么它是一个有用的功能?匿名内部类不够好?

+2

我删除了'java'标记,因为问题纯粹是关于Groovy语言,而不是它运行的JVM或Java语言。 –

+1

http://groovy.codehaus.org/Closures –

回答

9

Closure是一个Closure类实例,实现调用逻辑。 它可以作为参数传递或分配给一个变量。它也有一些关于范围变量访问和委托调用的逻辑。

方法是普通的Java方法。没什么特别的。

是的,匿名内部类有很多样板代码来执行简单的操作。

比较:

button.addActionListener(
    new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
      frame.dispose(); 
    } 
    } 
); 

VS

button.addActionListener { frame.dispose() } 

上有SO Groovy : Closures or Methods 和3链接到用户指南含有很多有用的信息一个相关的问题。

  1. http://groovy.codehaus.org/Closures
  2. http://groovy.codehaus.org/Closures+-+Formal+Definition
  3. http://groovy.codehaus.org/Closures+-+Informal+Guide
+0

查看[某些原因](http://www.javanicus.com/blog2/items/191-index.html)你的例子不是真正的词法关闭,甚至Groovy的创造者都称它为“根本性破碎”。 –

+0

@VorgvanGeir非常感谢有趣的链接,但我不确定它是否与OP的问题相关。 – Seagull

+0

@海鸥您发布的codehaus链接已不存在。你能否用这个更新它们:http://groovy-lang.org/closures.html。提前致谢。 –

2

而且,闭包是第一类对象,它们可以通过周围,返回和操纵。考虑:

def add = { n, m -> n + m } 
def add2 = add.curry(2) 

assert add2(4) == 6 

def makeAdder = { n -> 
    // return a Closure 
    { m -> n + m } 
} 
def anotherAdd2 = makeAdder(2) 

assert anotherAdd2(4) == 6