現在讓我們看一下Groovy中的Mixin的威力吧:
//
?創建一個Category,以重用該類中的靜態方法的實現
class ?FileCategory?{
???? // ?實現操作符(<<)重載(?<<?對應的方法為leftShift?)
???? static ?leftShift(self,?other)?{
???????? // ?將"Hello,?"以及other中的內容寫入self表示的文件中
????????self.write( " Hello,?$other " )
????????println? " done! "
????}
}
// ?利用關鍵字use,使用之前創建的Category
use?(FileCategory)?{
???? // ?創建File的一個實例,?并將"Hello,?山風小子"寫入該文件中,注意不帶雙引號
???? new ?File( " hello.txt " )? << ? " 山風小子 "
}
class ?FileCategory?{
???? // ?實現操作符(<<)重載(?<<?對應的方法為leftShift?)
???? static ?leftShift(self,?other)?{
???????? // ?將"Hello,?"以及other中的內容寫入self表示的文件中
????????self.write( " Hello,?$other " )
????????println? " done! "
????}
}
// ?利用關鍵字use,使用之前創建的Category
use?(FileCategory)?{
???? // ?創建File的一個實例,?并將"Hello,?山風小子"寫入該文件中,注意不帶雙引號
???? new ?File( " hello.txt " )? << ? " 山風小子 "
}
File類 已經繼承了Object類 ,但它通過Groovy中Mixin,重用了FileCategory類中leftShfit方法的實現,
其相關細節說明已經注于代碼中,希望大家喜歡 :)
未來Groovy的Mixin實現:http://docs.codehaus.org/display/GroovyJSR/Mixins
而從Groovy1.6beta-2-snapshot開始, Groovy支持如下寫法:
//
?改自官方例子
import ?java.util.concurrent.locks. *
Object.metaClass.mixin?ReentrantLock
def?name? = ? " abcdef "
name.lock()
try ?{
????println?name.isLocked()
}? finally ?{
????name.unlock()
}
import ?java.util.concurrent.locks. *
Object.metaClass.mixin?ReentrantLock
def?name? = ? " abcdef "
name.lock()
try ?{
????println?name.isLocked()
}? finally ?{
????name.unlock()
}
附:朝花夕拾——Groovy & Grails