概述
灵活初始化与具名参数
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"
}
注意:要想此类操作正确,类中必须有一个无参构造函数。没有构造函数,编译器会默认添加,如果已经有带参的构造函数,则需要自己手动添加一个无参构造函数。
最后
以上就是糊涂招牌为你收集整理的Groovy的灵活初始化与具名参数灵活初始化与具名参数的全部内容,希望文章能够帮你解决Groovy的灵活初始化与具名参数灵活初始化与具名参数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复