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

来源:开源中国社区 作者:oschina
  14 result ="integer"

15 break

16 case Number:

17 result ="number"

18 break

19 default: result ="default"

20 }

21 assert result =="number"

通常情况,使用isCase()方法可以判断一个数值是否为大小写。

 
别名导入 Import aliasing
Java,中当要使用来自两个不同包的同名class时,如

java.util.List 和 java.awt.List, 你能导入其中的一个类,而另一个你就不得不给其有效的重命名了.

还有时候我们在代码中经常使用一个名字非常长的类,使得整个代码变得臃肿不堪.

为了改善这些状况, Groovy 提供了别名导入的特性:

1 importjava.util.List as juList

2 importjava.awt.List as aList

3  

4 importjava.awt.WindowConstants as WC //import的时候 用 as 设置一个别名

当然也可以静态的导入某个方法:
 
1 import static pkg.SomeClass.foo

2 foo()

 

Groovy 的真值体系

在groovy中所有对象都可以被强制转为为一个boolean值,即: null, void 或空值 都 会视为 false, 其他的都视为 true.

所以不要再写 这种代码了:if (name != null && name.length > 0) {} 改为: if (name) {}

对于集合和其他数据类型同样适用.

因此,你可以在 诸如while(), if(), 三目运算符,Elvis 运算符(下面会讲)等等的判断条件中使用这种简单的方式.
更强悍的是可以给你的 类 添加 asBoolean() 方法,从而定制你这个类的真值的。
 

安全的操作对象图(嵌套的对象) Safe graph navigation
Groovy支持使用 . 操作符来安全的操作一个对象图.
Java中如果你对一个对象图中的某个节点感兴趣,想检查其是否为null的时候,经常会写出复杂的if嵌代码,如下:

1 if(order !=null) { //1

2 if(order.getCustomer() !=null) { //2

3 if(order.getCustomer().getAddress() !=null) { //3

4 System.out.println(order.getCustomer().getAddress());

5 }

6 }

7 }

而使用Groovy的安全操作符 ?. 可以讲上述代码简化为:

1 println order?.customer?.address

太精妙了。

操作连上 每个?.操作符前面的元素都会做Null检查,如果为null则抛出 NullPointerException 并且返回 一个 null值
 

断言 Assert
要检查参数、返回值等,你可以使用 assert 语句。

和 Java 的 assert 对比,Groovy 的 assert 无需单独激活。

1 def check(String name) {

2 // name non-null and non-empty according to Groovy Truth

3 assertname

4 // safe navigation + Groovy Truth to check

5 assertname?.size() >3

6 }

你将注意到 Groovy 的 Power Assert 语句提供更好的输出,包括每个子表达式断言时不同值的图形化视图。

Elvis (埃尔维斯) ?: 操作符给变量赋默认值
?: 是一个非常方便的给变量 赋 默认值的操作符,他是三目运算符(xx? a:b)的简写.
我们经常写如下三目运算代码:

1 def result = name !=null? name :"Unknown"//如果name为null时给'Unknown'的默认值,否则用原name的值

感谢Groovy的真值体系,null的检查可简单直接的通过 ‘name’来判断,null 会被转成 false.
再深入一点,既然总得返回'name',那在三目操作运算符中重复输入name两次就显得累赘了,可以将问号和冒号之间输入的重复变量移除,于是就成了Elvis操作符,如下:
1 def result = name ?:"Unknown" //如果判断name为 false 则取 "Unknown",否则 取name之值<span></span>

 

捕捉任何异常

如果你真的不在乎在一个try代码块中抛出的异常,groovy中可以简单的catch所有这些异常,并忽略其异常类型. 所以以后像这种捕捉异常的代码:

1 try{

2 // ...

3 }catch(Throwable t) {

4 // something bad happens

5 }

可以写成捕捉任意异常 ('any' or 'all', 或者其他你认为是"任意"的单词):
1 try{

2 // ...

3 }catch(any) {

4 // something bad happens

5 }

 

可选类型 建议
最后我将讨论一下何时和怎样使用 '可选类型' 这个特性.
Groovy让你自己来决定是 显示使用强类型 还是 使用def 关键字 来申明你要的东西,那么怎么决定呢?

我有个相当简单的经验法则:

当你写的代码将会被作为公共API给别人使用时,你应当总是使用强类型的申明。

这将使得: 接口约定更加明确,避免可能的错误类型参数的传递,有利于提供更易读的文档,在编辑如:仅你能使用的私有方法时,强制类型 会有利于IDE的代码自动完成功能,或使IDE更容易推断对象的类型,然后你就能更加自如的决定是否使用明确的类型了 
 


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

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


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