2009-12-01 61 views
31

我已經養成了在任何地方都可以使用閉包的習慣,即使我不需要訪問自由變量,我也可以取代常規方法。所以,我會用這樣的:Groovy:閉包或方法

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

..而不是這樣的:

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

這是不好的做法?我更喜歡在方法上使用閉包時獲得的額外能力,我更喜歡語法。

謝謝!

+3

只要記住,你不能輕易指定返回類型的閉包。對於方法來說更容易。而且,閉包在'@ TypeChecked'或'@ CompileStatic'上表現不佳。 – Seagull 2014-10-22 10:59:03

回答

40

我只在需要它們的地方使用閉包,即默認使用方法。我這樣做是因爲

  • 方法比關閉更簡單。閉包擁有一個委託人,一個所有者,可以保留在創建時位於本地範圍內的變量(稱爲「自由變量」)的權限。

    1. 閉幕本身
    2. 封閉所有者
    3. 封閉委託

但是這個命令可以在運行時改變,以及封閉的:默認情況下,方法的閉包中調用被解決委託也可以更改爲任何對象。

所有這些因素結合在一起可以使用封非常棘手神交一些代碼,所以如果你不使用的方法,而不是

  • 需要任何這種複雜的我更喜歡將其消除爲Groovy中定義的每個閉包生成.class文件。我完全沒有證據支持一個說法,即一個常規方法比閉包更高效,但是我有懷疑。最起碼,很多類可能會導致您用完PermGen的內存空間 - 這個曾經在我身上發生頻繁,直到我提出了我的PermGen空間約200MB

我不知道是否該做法我主張(默認使用方法,只有當你需要時才關閉)被廣泛認爲是「最佳實踐」,所以我很好奇聽到別人的想法。

6

儘管@Don所說的所有事情都是真實的,但我不知道它們中的任何一個都很重要。你可以覆蓋可以改變執行的閉包的委託,但是除非你傳遞閉包(反正你不能使用方法),否則你不必擔心這些事情發生。與代表一起玩是一項功能,而不是一項責任。

至於額外的類文件可能的性能影響,爲什麼如果您擔心性能會使用Groovy?

我的意見是,這並不重要。如果你的團隊中有很多人是舊的Java開發人員,那麼當你使用方法將要做的閉包時,他們可能會不喜歡它。另一方面,如果在閉包變得更有意義的時候,使用方法將所有東西弄得一團糟,那麼精通Groovy的人會感到惱火。

tl; dr - 沒有硬性規定,相反,您應該仔細考慮代碼的可讀性。

+1

我完全同意我的觀點相對較小,簡潔是一個更重要的考慮因素。 – 2011-09-11 23:22:43

+1

根據使用情況,由於可能未發佈'java.lang.ref.SoftReference'實例,過度使用閉包可能導致主要性能和內存降級。在常規的腳本和類中,這不會是一個問題,但在某些特定情況下(例如處理'MarkupBuilder'的巨大XML),您應該避免使用閉包。 – 2011-09-12 11:55:02

+1

我通常更喜歡過早優化的好風格。不時地分析你的代碼總是一個好主意,這將幫助你找出優化的機會。當然,Groovy(以及JDK)的每個新版本都可能帶來一組新的優化,因此優化代碼應該在成本/收益的基礎上完成。底線:寫出最可讀,最直觀的代碼,並且不浪費時間優化可能爲您優化的內容。 – ngreen 2014-01-27 16:05:29