首页 » Java程序员修炼之道 » Java程序员修炼之道全文在线阅读

《Java程序员修炼之道》8.3 与Java的差异新手陷阱

关灯直达底部

目前你基本上已经熟练掌握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也有publicprivateprotected级别;但和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处理。