下面关于Groovy闭包的声明的解释。

时间:2012-11-04 00:31:09

标签: groovy

我正在读这个:A closure looks a lot like a regular Java or Groovy code block, but actually it's not the same. The code within a regular code block (whether its a method block, static block, synchronized block, or just a block of code) is executed by the virtual machine as soon as it's encountered. With closures the statements within the curly brackets are not executed until the call() is made on the closure. In the previous example the closure is declared in line, but it's not executed at that time. It will only execute if the call() is explicitly made on the closure

而且我在想,这是真的,如果你有一个实例方法,在Java中,代码只在调用方法时执行,那么它们如何在上面说明一旦VM看到它就由VM执行它? 如果我有一个方法func(){int a =5; return a+5;},只有在被调用是我的理解时才会执行。

2 个答案:

答案 0 :(得分:3)

使用同步块或常规范围括号可能更好地进行描述。它试图表明的是,当执行线程遇到常规代码块时,它继续执行内容。使用闭包定义时,块中的代码不会立即执行 - 它用于定义/实例化包含该逻辑的闭包对象(例如,clos),稍后可以通过clos.call()执行(或者只是clos( ))。

示例:

def x = 1

synchronized(this) {
    x = 1000
}
println x //x == 1000

VS

def x = 1

Closure clos = { 
    x = 1000
}
println x // x == 1
clos()  // or clos.call()
println x // x == 1000

W / R / T方法/静态块:我不清楚是否有一些细微的方式可以在JVM上下文中使用“遇到”和“已执行”,这使得该语句的一部分正确,但对于实际目的,它充其量是误导性的。方法仍然只在被调用时执行,而不是由于它们的声明位于代码执行的明显路径中,因为以下内容可以在groovyConsole中运行以显示:

def x = 1

void methodA() {
    x = 1000
}

def b = {
    x = x + 1

}

println x // x is still 1

答案 1 :(得分:0)

另一个类比,不一定是技术上准确的,是将Closures视为具有单一方法(闭包的主体)的匿名内部类。

执行closure.call()或closure()(call()的简写),调用该单个方法。

当然,闭包还有其他功能,但我认为这是考虑基础知识的好方法。