Groovy优势2——使用call方法
在Groovy中我们给类可以增加call方法,然后隐式调用call方法。调用时,仅需输入括号和可选的参数,使用Groovy 写DSL尤其有用。同时可以增加多个带不同参数的call方法实现重载,在运行时根据参数决定。
代码示例
下面示例代码定义了User类,带了call方法的实现。调用时并没有输入方法的名称,甚至没有使用括号,仅传递参数。
class User {
String userName;
String address;
def call(final String userName){
this.userName = userName
this
}
def call(final Map data){
userName = data.get("userName") ?: userName
address = data.get("address") ?: address
this
}
def call(final Closure runCode){
runCode this
}
static void main(String [] args){
User user = new User( userName:"tommy",address:"xuzhou")
user "jack"
assert user.userName == "jack" // call with string parameter
Map data = [userName:"tommy",address:"shanghai"]
user data // call with map parameter
assert "tommy" == user.userName
assert "shanghai" == user.address //true
user{
println it.address // shanghai call with Closure
}
//call with Closure
def json = user {
new groovy.json.JsonBuilder(["user": ["name": it.userName, "address": it.address]]).toString()
}
assert json == '{"user":{"name":"tommy","address":"shanghai"}}'
}
}