Groovy 小記 it 關鍵字和 IDE 報錯
在工作中經常寫Groovy
指令碼,由於Groovy
與Java
的親戚關係,所以也就直接在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
工具實踐的時候也經常用到。有興趣可以參考以下文章:
- JsonPath實踐(一)
- JsonPath實踐(二)
- JsonPath實踐(三)
- JsonPath實踐(四)
- JsonPath實踐(五)
- JsonPath實踐(六)
- JsonPath工具類封裝
- 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-> 當前使用者:fv,IP:10.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-> 當前使用者:fv,IP:10.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熱文精選
相關文章
- let關鍵字和const關鍵字
- final關鍵字和static關鍵字
- out關鍵字和ref關鍵字的區別
- 關鍵字和保留字
- js關鍵字和方法JS
- DM 關鍵字、遮蔽關鍵字
- JavaScript 關鍵字和保留字JavaScript
- union和union all 關鍵字
- PHP static 關鍵字和 self 關鍵字例項化的區別PHP
- 【學習筆記】make 和 new 關鍵字的區別筆記
- Java記憶體模型——volatile關鍵字Java記憶體模型
- 關鍵字
- this關鍵字
- java中的static和final關鍵字Java
- Java基礎——final和static關鍵字Java
- JavaSE 關鍵字和識別符號Java符號
- JavaScript的關鍵字和保留字大全JavaScript
- abstract關鍵字 super 關鍵字 類與繼承繼承
- java記憶體模型及volatile關鍵字Java記憶體模型
- iOS @property及其關鍵字學習記錄iOS
- Javascript中的關鍵字'this'學習筆記JavaScript筆記
- volatile 關鍵字
- @Transient關鍵字
- friend關鍵字
- Auto關鍵字
- Swift 關鍵字Swift
- defer關鍵字
- typedef關鍵字
- params關鍵字
- dynamic關鍵字
- 4關鍵字
- [JavaScript] this 關鍵字JavaScript
- Volatile關鍵字
- static關鍵字
- super關鍵字
- final關鍵字
- synchronized 關鍵字synchronized
- const關鍵字