引用一个官方例子swapCase来展示一下Groovy是如何增强既有类的能力的(演示如何使用delegate,注意演示的是final类:String)
String.metaClass.swapCase?=?{->
??????def?sb?=?new?StringBuffer()
??????//?delegate与this类似,引用当前正被‘改造’的对象
??????delegate.each?{
???????????sb?<<?(Character.isUpperCase(it?as?char)???Character.toLowerCase(it?as?char)?:?
???????????????????Character.toUpperCase(it?as?char))
??????}
??????sb.toString()
}
String?s?=?"Hello,?world!"
println?s.swapCase()
运行结果:
hELLO,?WORLD!
说明:<<用于添加方法(如果方法已经存在,会发生groovy.lang.GroovyRuntimeException异常),=用于添加方法或覆盖既有方法
更加简洁的方法:
String.metaClass?{
????'static'?{
????????value?=?{
????????????it.toString()
????????}
????}
????
????swapCase?=?{?->
??????def?sb?=?new?StringBuffer()
??????//?delegate与this类似,引用当前正被‘改造’的对象
??????delegate.each?{
???????????sb?<<?(Character.isUpperCase(it?as?char)???Character.toLowerCase(it?as?char)?:?
???????????????????Character.toUpperCase(it?as?char))
??????}
??????sb.toString()
????}
}
String?s?=?'Hello,?world!'
println?s.swapCase()
println?String.value(new?Date())
运行结果:
hELLO,?WORLD! Sun?Jun?08?14:53:28?CST?2008