11、语句
(1)分号
l Groovy使用类似Java的语法,但是语句的分号是可选的
l 如果每行一个语句,就可以省略分号;如果一行上有多个语句,就要用分号来分隔
x = [1, 2, 3] println x y = 5; x = y + 7 println x assert x == 12
l 一个语句可以跨越多行,对于方法的参数列表或复杂的表达式,可能会这样做
x = [1, 2, 3, 4, 5, 6] println( x ) if (x != null && x.size() > 5) { println("Works!") } else { assert false: "should never happen ${x}" }
(2)方法调用
l 方法调用的语法和Java类似,支持静态和实例方法
class Foo { calculatePrice() { 1.23 } static void main(args) { foo = new Foo() p = foo.calculatePrice() assert p > 0 println "Found price: " + p } }
l 注意,return关键字在方法的最后是可选的;同样,返回类型也是可选(缺省是Object)
l 在Groovy中方法的调用可以省略括号,只要有参数,并且没有歧义
(3)传递命名参数
l 在调用方法时,可以传递命名参数,参数的名字和值用分号分隔(象Map语法),参数名是唯一标识字符串
bean = new Expando(name:"James", location:"London", id:123) println "Hey " + bean.name assert bean.id == 123
l 当前这种方法传递只实现具有Map的方法调用或JavaBean构造
(4)传递闭包给方法
请参考《Groovy快速入门》
(5)动态方法分派
l 如果变量没有使用类型强制,动态方法分派被使用,这经常被指为动态类型,而Java缺省使用静态类型
l 可以在代码中混合使用动态和静态类型
dynamicObject = "hello world".replaceAll("world", "Gromit") dynamicObject += "!" assert dynamicObject == "hello Gromit!" String staticObject = "hello there" staticObject += "!" assert staticObject == "hello there!"
(6)属性
l 通过“.属性名”访问属性
bean = new Expando(name:"James", location:"London", id:123) name = bean.name println("Hey ${name}") bean.location = "Vegas" println bean.name + " is now in " + bean.location assert bean.location == "Vegas"
l 上面的特殊bean Expando在运行时,动态添加属性
l 它实际上是一个行为象动态bean的Map:增加name/value对和等效的getter/setter方法,就象定义一个真正的bean
(7)安全导航
l 如果你在访问复杂对象时,不想遇到NullPointerException异常,你可以使用“->”而不是“.”来导航
foo = null bar = foo->something->myMethod() assert bar == null 
|