Groovy:闭包或方法

时间:2009-12-01 10:55:11

标签: groovy closures

即使我不需要访问自由变量,我也养成了在任何地方使用Closures代替常规方法的习惯。所以,我会用这个:

def addNumbers = { left, right -> left + right }

..而不是这个:

def addNumbers (left,right) { left + right }

这是不好的做法吗?我更喜欢使用闭包而不是方法时获得的额外功能,我更喜欢语法。

谢谢!

2 个答案:

答案 0 :(得分:45)

我只使用我需要的闭包,即我默认使用方法。我这样做是因为

  • 方法比闭包更简单。闭包有一个委托,一个所有者,在创建时保留对本地范围内变量的访问权限(你称之为“自由变量”)。默认情况下,闭包内的方法调用由以下方法解决:

    1. 关闭本身
    2. 关闭所有者
    3. 关闭代表

但是这个顺序可以在运行时更改,并且闭包的委托也可以更改为任何对象。

所有这些因素结合起来可以使一些使用闭包的代码非常难以理解,所以如果你不需要任何这种复杂性,我宁愿通过使用方法来消除它

  • 为Groovy中定义的每个闭包生成一个.class文件。我完全没有证据支持声称常规方法比闭包更高效,但我怀疑。至少,很多类可能会导致你耗尽PermGen内存空间 - 这种情况经常发生在我身上,直到我将PermGen空间提升到大约200MB

我不知道我所倡导的做法(默认情况下使用方法和仅在需要时使用闭包)被广泛认为是“最佳做法”,所以我很想听听别人的想法。

答案 1 :(得分:6)

虽然@Don所说的所有事情都属实,但我不知道其中任何一件事都是如此重要。你可以覆盖一个可以改变执行的闭包的委托,但除非你传递闭包(你不能用方法做什么),你真的不必担心发生的任何事情。与代表一起玩是一项功能,而非责任。

对于额外类文件可能造成的性能影响,如果您担心性能,为什么还要使用Groovy?

我的意见是,这并不重要。如果您的团队中有很多人都是旧的Java开发人员,那么当您使用方法可以执行的闭包时,他们可能会不喜欢它。另一方面,当一个闭包更有意义的时候,如果你用方法搞乱一切,那么一个流利的Groovy会很生气。

tl; dr - 没有严格的规则,相反,你应该在考虑代码可读性的情况下运用良好的判断力。