为Java开发者解读Groovy编程风格和语言特性

来源:开源中国社区 作者:oschina
  

 

当一个Java开发人员加入到Groovy的开发之旅的时候,他/她经常带着Java思想去思考,并逐步地学习Groovy,每次学习一个特性,这会让他慢慢变得更有创造性和写出更符合语言习惯的Groovy代码。这篇文章的目的是引导这些开发人员去学习基本的Groovy编程风格,学习新的操作技巧,新的语言特性,例如闭包等等。这篇文章并不会详细铺开描述,而是给读者一个入门的指引,并让读者在以后的深入学习打好基础。如果你喜欢这篇文章,可以贡献你的一份力量去丰富它。


无分号
C / C++ / C# / Java开发者,经常到处使用分号。尽管Groovy支持99%的java语法,有时你只需简单的把java代码粘贴到Groovy程序里,但是却带着一大堆分号。在Groovy里,分号是可选的,你可以省略他们,更常用的用法是删除它们。
 

返回关键字 (Return) 变得可选
在Groovy的世界里面,方法的程序块结尾可以不写'return'关键字而照样返回值。尤其是对于语句不多的方法和闭包。这样的写法更优美更简洁:

 
1 String toString() {return"a server"}

2 String toString() {"a server"}

但有些情况却不那么优美,例如你使用了变量,并在两行里面出现两次:

 

1 def props() {

2 def m1 = [a:1, b:2]

3 m2 = m1.findAll { k, v -> v %2==0}

4 m2.c =3

5 m2

6 }

在这个例子里面,或者是在最后一个表达式后面加上一个空行,抑或是显式地加上'return'关键字会令代码更有可读性。

我自己个人习惯,有时候喜欢用return关键字,有时候又不喜欢,这跟个人口味有关系吧。但是,更多时候,例如在闭包里面,我更喜欢不写return关键字。所以即使return关键字是可选的,也不会强制你不能使用它,如果你认为它会打破代码的可读性。
 

谨慎为上,然而当你使用def关键字定义,而并非用代替具体某一个类型去定义的方法,有时候你会惊奇的发现最后一条表达式会作为返回结果而返回。所以更多时候更推荐使用具体的类型(例如void或类型)作为返回类型。在我们上面的例子中,如果我们忘记了把m2放在最后一行并作为返回值,那么最后的一个表达式将是m2.c = 3,这样会导致数值3作为返回值返回,而不是我们期待的结果。

形如if/else语句,try/cath语句同样可以返回值,因为它们里面都有"最后一个表达式"会被返回。

01 def foo(n) {

02 if(n ==1) {

03 "Roshan"

04 }else{

05 "Dawrani"

06 }

07 }

08  

09 assertfoo(1) =="Roshan"

10 assertfoo(2) =="Dawrani"

 
 

Def 和 类型

当我们讨论def和类型,我经常会发现一些开发人员既用'def'又用类型。但是'def'在这里是多余的。所以,大家要做一个选择,要不用'def', 要不就用类型。

所以不要写出如下的代码:

1 def String name = "Guillaume"

可以写成
1 String name ="Guillaume"

当我们在Groovy里面使用def,真正的类型是Object(所以你可以向用def定义的变量,赋值任何的对象,并且,当一个方法是用def作为返回值的时候,可以以任何对象类型作而返回)。
当一个方法未声明变量类型,你可以使用def,但是这不是必须的,所以可以省略他,所以可以代替下面的语句:

1 void doSomething(def param1, def param2) { }

推荐:
1 void doSomething(param1, param2) { }

但是,就如我们在文章末尾提到的,我们更推荐为方法的参数指定类型。这样可以帮助提高代码的可读性,也可以帮助IDE工具使代码完整,或者利用Groovy的静态类型检查或静态编译功能。
另外一个def多余的地方是定义构造函数,应避免使用:

1 class MyClass {

2 def MyClass() {}

3 }

应去掉 构造函数前的'def':
1 classMyClass {

2 MyClass() {}

3 }
 

默认的Public

默认情况,Groovy会认为类和方法是定义为'public'的。所以你不需要显式的声明public。当需要声明为非public的时候,你需要显式的指定修饰符。

所以避免如下写法:

1 public class Server {

2 public String toString() {return "a server"}

3 }

推荐使用如下简洁的写法
1 class Server {

2 String toString() {"a server"}

3 }

你可能会关心包范围内的可访问性问题。事实上,Groovy允许省略public, 是因为这个包范围里面默认情况下是不支持public,但是事实上有另外一个Groovy注释语法去实现可访问性:
1 class Server {

2 @Package ScopeCluster cluster

3 }
 

省略圆括号

Groovy允许你在顶级表达式中省略圆括号,例如println语句:

1 println"Hello"

2 method a, b

对比:
1 println("Hello")

2 method(a, b)

当方法的最后一个参数是闭包的时候,例如使用Groovy的'each'迭代机制,你可以把闭包放在括号之外,甚至省略括号:
1 list.each( { println it } )

2 list.each(){ println it }

3 list.each { println it }

通常我们推荐使用上面第三种写法,它显得更自然,因为没有圆括号是多么的多余!
但是Groovy在某些情况并不允许你去掉圆括号。就像我之前说的,顶级表达式可以省略,但是嵌套的方法或者赋值表达式的右边,你却不能省略:

1 def foo(n) { n }

2  


时间:2013-01-17 09:10 来源:开源中国社区 作者:oschina 原文链接

好文,顶一下
(0)
0%
文章真差,踩一下
(0)
0%
------分隔线----------------------------


把开源带在你的身边-精美linux小纪念品
无觅相关文章插件,快速提升流量