在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"}}' } }