Gradle是目前最流行的Java構(gòu)建工具,基于Groovy開發(fā)巡雨,因此使用Gradle前必須對(duì)groovy有一定的了解纵隔。記錄groovy使用中的一些重要概念, 后續(xù)繼續(xù)補(bǔ)充。
詳細(xì)文檔參考http://www.groovy-lang.org/single-page-documentation.html嘹承,至少看完Groovy Language Specification這部分。 這是一份官方的權(quán)威文檔,案例與解析的方式并用拍顷,可以快速掌握Groovy基本語(yǔ)法和使用方法绅作。需要的只是Java基礎(chǔ)、克服中文文檔的依賴(可以配合強(qiáng)大的翻譯插件,軟件...)和閱讀文檔的耐心骤竹。
閉包(Closure)
Groovy中的閉包是一個(gè)公開帝牡、匿名的代碼塊,可以接收參數(shù)蒙揣,將返回值賦值給變量靶溜。閉包可以引用在其周圍范圍內(nèi)聲明的變量。查看1.5. Closures以確保能理解和使用閉包.
代理/委托策略(Delegation strategy)
Groovy定義作為Closure實(shí)例的閉包(closure)與Java 8中的 lambda 表達(dá)式有很大的不同. 代理是一個(gè) lambda 中沒(méi)有等價(jià)物的一個(gè)關(guān)鍵概念. 可修改閉包的代理和代理策略使得在Groovy中設(shè)計(jì)優(yōu)美的DSL成為可能.
Owner, delegate和this
為了理解代理的概念, 我們必須先解釋閉包中的this
. 一個(gè)閉包定義了3個(gè)不同的事物:
this
對(duì)應(yīng)于定義閉包的包裹類(enclosing class)owner
對(duì)應(yīng)于定義閉包的包裹對(duì)象(enclosing object), 可能是類或閉包delegate
對(duì)應(yīng)于當(dāng)接收著沒(méi)有定義可供調(diào)用方法或解析屬性時(shí)的第三方對(duì)象
請(qǐng)參看http://docs.groovy-lang.org/latest/html/documentation/#closure-owner中的代碼示例
補(bǔ)充:
this
和owner
: 大部分情況下是同一個(gè)對(duì)象, 定義在閉包中的閉包其owner
為外層閉包對(duì)象, 而此時(shí)this
指外層閉包所在的類對(duì)象.
owner
和delegate
: 默認(rèn)情況下閉包的delegate
就是owner
, 但可以通過(guò)Closure.delegate
來(lái)修改默認(rèn)行為
代理策略
閉包中定義了若干代理策略供選擇
Closure.OWNER_FIRST
是默認(rèn)策略. 若 owner中存在屬性和方法則調(diào)用owner的, 否則使用 delegate .Closure.DELEGATE_FIRST
反之: delegate 優(yōu)先, 其次 ownerClosure.OWNER_ONLY
will 只解析 owner的屬性和方法, 忽略delegate.Closure.DELEGATE_ONLY
只解析delegate的屬性和方法, 忽略owner.Closure.TO_SELF
可以由需要高級(jí)元編程技術(shù)并希望實(shí)現(xiàn)自定義解析策略的開發(fā)人員使用:解決方案只能在包裹類自身進(jìn)行, 而不會(huì)作用在owner或delegate 上懒震。實(shí)現(xiàn)自定義Closure
的唯一選擇罩息。
Differences with Java
Operator overloading
所有支持重載的操作符及對(duì)應(yīng)方法見: http://docs.groovy-lang.org/latest/html/documentation/#Operator-Overloading
Traits
http://docs.groovy-lang.org/latest/html/documentation/#_traits