Groovy的灵活初始化与具名参数

来源:互联网 发布:淘宝代运营团队 编辑:程序博客网 时间:2024/06/07 14:20

灵活初始化与具名参数

Groovy中可以灵活初始化一个javabean类。在构建对象时候,可以简单地以逗号分隔的名值对来给出属性值。如果类有一个无参构造器,该操作会在构造器之后执行。也可以设计自己的方法,使其接受具名参数。要利用这一特性,需要吧第一个形参定义为Map。下面是代码:

class Robot{    def type,height,width    def access(location, weight, fragile){        println "Received fragile? $fragile,weight: $weight,loc:$location"    }}robot = new Robot(type:'arm',width:10,height:40)println "$robot.type,$robot.height,$robot.width"robot.access(x:30,y:20,z:10,50,true)//可以修改参数顺序robot.access(50,true,x:30,y:20,z:10)//可以修改参数顺序robot.access(true,x:30,y:20,z:10,50)

输出的结果:
arm,40,10
Received fragile? true,weight: 50,loc:[x:30, y:20, z:10]
Received fragile? true,weight: 50,loc:[x:30, y:20, z:10]
Received fragile? 50,weight: true,loc:[x:30, y:20, z:10]


Robot实例把type、height、width等实参当做了名值对。这里使用Groovy编译器为我们创建的灵活的构造器。

access()方法有3个形参,但如果第一个为Map,则可以将这个映射中的键值对展开放入在我们的实参列表中。
如果发送的实参的个数多余方法的形参个数,而且多出的实参是名值对,那么Groovy会假设方法的第一个形参是一个Map,然后将实参列表中的所有名值对组织到一起,作为第一个形参的值,之后,再将剩下的实参按照给出的顺序赋给其他的形参,就和我们输出的结果一样。

如果想使用具名参数,那最好只接受一个Map参数,而且不要混入不同的形参。在这个例子中,如果传递的是3个整型实参,该特性会导致一个问题。这种情况下,编译器将会顺序传递实参,而不会从这些实参创建一个映射,因而结果也就不会是我们想要的。通过显示地将第一个形参指定为Map,可以避免混乱:

 def access(Map location, weight, fragile){        println "Received fragile? $fragile,weight: $weight,loc:$location"    }

注意:要想此类操作正确,类中必须有一个无参构造函数。没有构造函数,编译器会默认添加,如果已经有带参的构造函数,则需要自己手动添加一个无参构造函数。