Gradle是目前最流行的Java構建工具,基於Groovy開發,因此使用Gradle前必須對groovy有一定的瞭解。記錄groovy使用中的一些重要概念, 後續繼續補充。
詳細文檔參考http://www.groovy-lang.org/single-page-documentation.html,至少看完Groovy Language Specification這部分。 這是一份官方的權威文檔,案例與解析的方式並用,可以快速掌握Groovy基本語法和使用方法。需要的只是Java基礎、克服中文文檔的依賴(可以配合強大的翻譯插件,軟件...)和閱讀文檔的耐心。
閉包(Closure)
Groovy中的閉包是一個公開、匿名的代碼塊,可以接收參數,將返回值賦值給變量。閉包可以引用在其周圍範圍內聲明的變量。查看1.5. Closures以確保能理解和使用閉包.
代理/委託策略(Delegation strategy)
Groovy定義作爲Closure實例的閉包(closure)與Java 8中的 lambda 表達式有很大的不同. 代理是一個 lambda 中沒有等價物的一個關鍵概念. 可修改閉包的代理和代理策略使得在Groovy中設計優美的DSL成爲可能.
Owner, delegate和this
爲了理解代理的概念, 我們必須先解釋閉包中的this
. 一個閉包定義了3個不同的事物:
this
對應於定義閉包的包裹類(enclosing class)owner
對應於定義閉包的包裹對象(enclosing object), 可能是類或閉包delegate
對應於當接收着沒有定義可供調用方法或解析屬性時的第三方對象
請參看http://docs.groovy-lang.org/latest/html/documentation/#closure-owner中的代碼示例
補充:
this
和owner
: 大部分情況下是同一個對象, 定義在閉包中的閉包其owner
爲外層閉包對象, 而此時this
指外層閉包所在的類對象.
owner
和delegate
: 默認情況下閉包的delegate
就是owner
, 但可以通過Closure.delegate
來修改默認行爲
代理策略
閉包中定義了若干代理策略供選擇
Closure.OWNER_FIRST
是默認策略. 若 owner中存在屬性和方法則調用owner的, 否則使用 delegate .Closure.DELEGATE_FIRST
反之: delegate 優先, 其次 ownerClosure.OWNER_ONLY
will 只解析 owner的屬性和方法, 忽略delegate.Closure.DELEGATE_ONLY
只解析delegate的屬性和方法, 忽略owner.Closure.TO_SELF
可以由需要高級元編程技術並希望實現自定義解析策略的開發人員使用:解決方案只能在包裹類自身進行, 而不會作用在owner或delegate 上。實現自定義Closure
的唯一選擇。
Differences with Java
Operator overloading
所有支持重載的操作符及對應方法見: http://docs.groovy-lang.org/latest/html/documentation/#Operator-Overloading
Traits
http://docs.groovy-lang.org/latest/html/documentation/#_traits