目前你基本上已经熟练掌握Groovy的基本语法了,当然其中部分原因是它跟Java语法很像。但这种相似有时可能是“诈”,所以本节来讨论那些经常困扰Java开发人员的语法。
Groovy有大量可以省略的语法,比如:
- 语句结束处的分号;
- 返回语句(
return
); - 方法参数两边的括号;
public
访问限定符。
这类设计是为了让源码更简洁,在快速设计原型时都能体现出优势来。
其他修改包括去掉已检查和未检查异常之间的区别,相等概念的替代办法,以及不再使用内部类。我们先从最简单的开始:可选的分号和返回语句。
8.3.1 可选的分号和返回语句
在Groovy中,语句结束处的分号(;
)是可选的,除非一行中有多条语句,否则都可以省略。
此外,从方法中返回对象或值时不必使用return
关键字。Groovy会自动返回最后一个表达式的计算结果。
代码清单8-1演示了这些可选语法,并返回了方法中最后一个表达式的计算结果3。
代码清单8-1 分号和返回语句可以省略
//没有分号 Scratchpad pad = new Scratchpadprintln(pad.doStuff)public class Scratchpad{ public Integer doStuff { def x = 1 def y; def String z = /"Hello/"; x = 3 //没有返回语句 }}
上面的代码看起来跟Java还是很像,而Groovy的简洁风格其实还要更强。接下来你会看到Groovy如何省略方法参数两边的括号。
8.3.2 可选的参数括号
如果Groovy里的方法调用至少有一个参数,并且没有二义性,则可以省略括号。也就是说下面的代码
println(/"It/'s Groovy baby, yeah!/")
可以写成
println /"It/'s Groovy baby, yeah!/"
代码变得更简洁了,可读性仍然没受影响。
下一个特性是可选的public
访问限定符,再用上它,Groovy代码看起来就不太像Java了。
8.3.3 访问限定符
优秀的Java开发人员都知道确定类、方法和变量的访问级别是面向对象设计的重要组成部分。跟Java一样,Groovy也有public
、private
和protected
级别;但和Java不同,Groovy的默认访问级别是public
。所以我们把代码清单8-1改一下,去掉一些默认的public
限定符,加几个privte
限定符,如代码清单8-2所示。
代码清单8-2 public
是默认访问限定符
Scratchpad2 pad = new Scratchpad2println(pad.doStuff)class Scratchpad2 //没有指定public访问限定符{ def private x; Integer doStuff { x = 1 def y; def String z = /"Hello/"; x = 3 }}
继续语法精简的主题,作为一名Java开发人员,你对用在方法签名中抛出已检查异常的throws
语句熟不熟悉?
8.3.4 异常处理
跟Java不同,Groovy不区分已检查异常和未检查异常。Groovy编译器会忽略方法签名中的所有throws
语句。
在保证源码可读的前提下,Groovy采用了一些快捷语法来简化代码。接下来看一个有严重语义影响的语法变化:相等操作符。
8.3.5 Groovy中的相等
遵循最小意外原则,Groovy把==
当做Java中的equals
方法。这是直觉式开发人员的又一项福利,他们不必再像用Java时为原始类型和对象倒腾==
和equals
。
检查真实的对象是否相等,需要使用Groovy内置的is
函数。这一规则有个例外,就是你仍然可以用==
来检查一个对象是否为null
。代码清单8-3说明了这些特性。
代码清单8-3 Groovy中的相等
Integer x = new Integer(2)Integer y = new Integer(2)Integer z = null//隐含的equals调用if (x == y){ println /"x == y/"}//检查对象是否相等if (!x.is(y)){ println /"x is not y/"}//用is检查是否为null if (z.is(null)){ println /"z is null/"}//检查是否为nullif (z == null){ println /"z is null/"}
当然,如果你喜欢,仍然可以用equals
方法检查相等关系。
最后,还有一个应该简单提一下的Java结构——内部类,Groovy中它基本被一个新的语言结构取代了。
8.3.6 内部类
Groovy支持内部类,但大多数情况下我们应该用函数字面值替代它。下一节讨论函数字面值,它是一个很强的现代编程结构,应该占用更多篇幅介绍。
用Groovy可以写出更简洁的代码,而且并不影响代码的可读性,如果你喜欢,仍然可以继续使用Java的(大多数)语法结构。接下来,你会看到一些Java还不具备的Groovy语言特性。其中的某些特性很可能就是你选用Groovy的关键,比如XML处理。