天天看點

用Groovy思考 第四章 Groovy特性深入用Groovy思考 第四章 Groovy特性深入

版權聲明:本文為部落客chszs的原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chszs/article/details/8774785

用Groovy思考 第四章 Groovy特性深入

作者:chszs,轉載需注明。部落格首頁:http://blog.csdn.net/chszs

1. 斷言

Java開發者常常使用JUnit或TestNG做單元測試,是以對斷言是很清楚的。斷言是用于驗證假設的條件是否為真。在Groovy的斷言中,如果假設的條件不為真,那麼就會抛出java.lang.AssertionError異常。使用Groovy表達式來測試假設條件。

比如:

groovy:000> assert 1==2 : "One isn't Two"

ERROR java.lang.AssertionError:

One isn't Two. Expression: (1 == 2)

        at groovysh_evaluate.run (groovysh_evaluate:2)

        ...

Java的斷言也是這麼寫的:

assert 1==2 : "One isn't Two";

可見,Groovy的斷言文法與Java的斷言相同,Groovy的斷言可以省略分号。

斷言的使用技巧:

當你使用斷言時,你應用包含一條消息。此消息可以幫助其他人維護和了解你的代碼,理清你的意圖。

2. 強斷言

Groovy的斷言assert關鍵字僅僅是檢查表達式是否為真。如果為假,斷言僅僅告訴開發者,表達式不成立,以及表達式使用的變量值,除此以外什麼都沒有。如果使用強斷言,斷言的輸出會提供表達式的每一個子表達式的可視化展現。下面我将詳細說明強斷言。

groovy:000> assert 1==1: "One isn't Two"

===> null

groovy:000> assert new File('HelloWorld.txt')==new File('Hello.txt')

ERROR org.codehaus.groovy.runtime.powerassert.PowerAssertionError:

assert new File('HelloWorld.txt')==new File('Hello.txt')

       |                         | |

       HelloWorld.txt            | Hello.txt

                                 false

斷言可以友善地對代碼進行測試。

3. Strings

Groovy支援兩種字元串:正常的Java字元串和GStrings。

在Groovy中,用單引号或雙引号括起來的字元串是java.lang.String類的一個執行個體,

GStrings是groovy.lang.GString類的一個執行個體,它允許在文本中包含占位符。GStrings并不是String的子類,因為String類是final類型,而且是不能被擴充的。

GString很像普通的字元串,但是他允許在其内使用${..}嵌入變量。如果内嵌的變量隻是占位符,那麼可以省略{}花括号。

Groovy支援一些程式設計語言如Perl或Ruby所謂的字元串插入(String Interpolation)。字元串插入是字元串内的表達式或變量的替代。如果你熟悉Unix Shell程式設計或Ruby、Perl程式設計,那麼你應該很熟悉這一點。

Java不支援字元串插入,你必須手動的進行值連結。

Java的字元串操作例子:

String name = "Jim";

String helloName = "Hello " + name;

System.out.println(helloName);

如果是使用Groovy的GString,那麼可以這樣:

groovy:000> str1 = "Li Sir"

groovy:000> str2 = "Hello "

groovy:000> println "$str2$str1"

Hello Li Sir

可見,正如前面所講,如果内嵌的變量隻是占位符,那麼可以省略{}花括号。

當Groovy看到表達式内的内嵌變量時,Groovy會構造一個org.codehaus.groovy.runtime.GStringImpl來代替java.lang.String。當通路GString時,表達式會被重新計算。

注意,你可以在${}内包含任意有效的Groovy表達式,可以是方法調用或變量名。

4. 單行字元串

單行字元串可以用單引号或雙引号包圍,但是兩者是有差別的。

單引号包圍的表達式,裡面的字元串插值是不會被識别的。雙引号包圍的表達式正好相反。

舉例:

name = "LiSir"

s1 = 'Hello $name'

println s1

輸出:

Hello $name

例子:

s1 = "Hello $name"

Hello LiSir

可見,由雙引号定義的字元串,其内嵌的表達式會被解釋。

5. 多行字元串

Groovy支援字元串跨越多行,多行字元串由三個雙引号或者三個單引号定義。

多行字元串對于建立模闆(如XML模闆)或内嵌的文檔(SQL語句、HTML等)是非常有用的。還有很多用途。比如,可以使用多行字元串和字元串插值建立電子郵件的主體内容。

def name = "Jim"

def multiLineQuote = """

Hello, ${name}

This is a multiline string with double quotes

"""

println multiLineQuote

println multiLineQuote.class.name

def multiLineSingleQuote = '''

This is a multiline string with single quotes

'''

println multiLineSingleQuote

println multiLineSingleQuote.class.name

Hello, Jim

org.codehaus.groovy.runtime.GStringImpl

java.lang.String