Groovy 小記 it 關鍵字和 IDE 報錯

FunTester發表於2020-09-23

在工作中經常寫Groovy指令碼,由於GroovyJava的親戚關係,所以也就直接在Intellij IDEA工具上寫了,一是因為方便,二是也找不到其他工具了。

但是在使用的過程中總會遇到一些相容性的問題。Intellij IDEA對於Groovy的支援並不完美,大概也是Groovy語言特性過多的原因。我下載了一個Groovy檢查的外掛,依然還有漏網之魚。下面分享一些大大小小的,以方便後來之人。

IDE報錯

在使用Groovy語法特性的時候,經常會遇到標紅和報錯,但是Intellij IDEA依然會允許程式執行。但是在執行中可能會遇到錯誤,還得返回來檢查,甚至有時候IDE還不會提示這個錯誤。所以我在寫Groovy指令碼時候,之前是更多偏重於用Java的語法。最近改變了自己的習慣之後,發現有一部分IDE報錯其實沒有問題的。例如下面的兩個例子:

獲取屬性

Groovy獲取屬性有三種寫法。

user.name
user["name"]
user.getName()

對的,你沒有看錯,第一個寫法和第三個寫法在Groovy裡面包含了不同的含義,因為Groovy正常情況下沒有getName()這個方法。至於第二種寫法算是特殊的語法。

上面三個語法不僅是針對User物件,對於JSonobject依然適用,我在使用JsonPath工具實踐的時候也經常用到。有興趣可以參考以下文章:

但是第二種寫法在Intellij IDEA裡面就會被標紅,提示出錯。

泛型方法呼叫

這是是我在做效能測試的過程中遇到的,我在ThreadBase<T>定義了一個物件public T t;,最開始的想法是用來處理執行緒私有資料物件的,但是後來發現其實直接新建類比較合適,就用的不多了。

有興趣的可以參考以前的文章:

先發一個第一種寫法,也是我現在最常用的寫法。

static class TT extends ThreadLimitTimesCount {

Mirro m

int aid = 0

public TT(Mirro mirro, int times) {
super()
this.m = mirro
this.times = times
}

@Override
protected void doing() throws Exception {
def pre = m.createPre()
if (aid == 0) {
aid = pre.getJSONObject("data").getIntValue("activity_id")
}
m.delPre(aid)
}
}

再發一下之前的寫法。

static class TT extends ThreadLimitTimesCount {

int aid = 0

public TT(Mirro mirro, int times) {
super()
this.t = mirro
this.times = times
}

@Override
protected void doing() throws Exception {
def pre = m.createPre()
if (aid == 0) {
aid = pre.getJSONObject("data").getIntValue("activity_id")
}
t.delPre(aid)
}
}

已經取消了Mirro這個屬性,但是在最後會有報錯,如圖:

這種情況還會出現在def修飾的物件呼叫方法獲取屬性的時候,這個時候就需要微微一笑由他去吧

it關鍵字

Groovy語言中迴圈中,it關鍵非常有用,比如遍歷一個String陣列或者集合物件的話,直接用it就可以代表遍歷到的String物件。舉個例子:

5.times {
output(it)
}

控制檯輸出:

INFO-> 當前使用者:fvIP10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.6
INFO-> 0
INFO-> 1
INFO-> 2
INFO-> 3
INFO-> 4

Process finished with exit code 0

今天遇到一個雙層遍歷的問題,突然發現不知道在雙層遍歷的情況下it關鍵字是否可以通用,也就是在外層遍歷時候使用it,然後在內層遍歷時候也用it,兩個it表示不同的遍歷物件。下面我們驗證一下:

3.times {
output(it * 10)
3.upto(5) {
output(it)
}
}

控制檯輸出:


INFO-> 當前使用者:fvIP10.60.192.21,工作目錄:/Users/fv/Documents/workspace/fun/,系統編碼格式:UTF-8,系統Mac OS X版本:10.15.6
INFO-> 0
INFO-> 3
INFO-> 4
INFO-> 5
INFO-> 10
INFO-> 3
INFO-> 4
INFO-> 5
INFO-> 20
INFO-> 3
INFO-> 4
INFO-> 5

Process finished with exit code 0

果然完美解決我的疑惑,不得不欽佩Groovy的設計者。


公眾號FunTester首發,原創分享愛好者,騰訊雲和掘金社群首頁推薦,知乎七級原創作者,歡迎關注、交流,禁止第三方擅自轉載。

FunTester熱文精選

相關文章