Groovy閱讀小注

1. 安全導航操做符 ?.,只有對象引用不爲空時纔會分派調用。java

def a
a?.isEmpty()


2. groovy不強迫捕獲咱們不關心的異常。數組

捕獲全部Exception 安全

try{
}catch(ex){
}


3. groovy默認都是public的。閉包


4. groovy默認提供構造器。dom

class Robot{
    def type, height, width
} 
robot = new Robot(type: 'arm', width: 10, height: 40)


5. groovy傳參ide

出現鍵值對的形式,groovy會將全部鍵值對做爲第一個形參(Map)的Entry,其他參數按順序賦給剩餘形參。spa

class Robot{
    def access(location, weight, fragile){
        print "$fragile, $weight, $location"
    }
}
robot.access(x: 30, y: 20, z:10, 5, true)
//可改變順序
robot.access(5, true, x: 30, y: 20, z:10)

注意:使用鍵值對傳參,最好是當參數僅有一個Map時使用;.net

若是必定要使用一個Map + 多個參數傳遞的形式,請顯示聲明Map類型。
code

class Robot{
    def access(Map location, weight, fragile){
        print "$fragile, $weight, $location"
    }
}

當實參包含的不是兩個對象和一個任意鍵值對,代碼就會報錯。對象


6. 可選形參, 方法能夠不用再寫重載

def log(x, base = 10){
    Math.log(x) / Math.log(base)
}


6.1 變長傳參

最後一位形參是數組形式

def receiveVarArgs(int a, int... b){}
def receiveVarArg(int a, int[] b){}

注意:Groovy將 [2, 3]看做是ArrayList的一個實例對象,所以調用時:

receiveVarArgs(1, [2, 3, 4] as int[])


可參考Groovy建立數組、列表的區別:

int[] arr = [1, 2, 3]
def arr1 = [1, 2, 3] as int[]
def arr2 = [1, 2, 3] //ArrayList類型


7. 多賦值。返回數組,被多賦值給各個變量。

等號左邊變量多的,將設爲null(不能默認null的,拋異常),右邊值多的,將丟棄。

def splitName(fullName){
fullName.split(' ')
}
def (firstName, lastName) = splitName('James Bond')


所以能夠延伸爲交換變量

def a = 1
def b = 2
(a, b) = [b, a]


8. 實現接口

一接口,單方法

def diaplyMouseLocation = {positionLabel.setText("$it.x, $it.y")}
frame.addMouseListener(diaplyMouseLocation as MouseListener)


一接口,多方法

def handleFocus = [
    focusGained : {}
    focusLost : {}
]


動態實現接口, asType()做爲何的接口實現

events = ['WindowListener', 'ComponentListener']//能夠是更動態的一些輸入
handler = {msgLabel.setText("$it")}
for(event in events){
    handlerImpl = handler.asType(Class.forName("java.awt.event.${event}"))
    frame."add${event}"(handlerImpl)
}


9. 默認布爾處理

groovy基本都爲對象,除引用對象不爲空爲true外,有些對象還有以下狀況也爲true。

Boolean 值爲true
Collection 不爲空
Map 映射不爲空
Char 不爲0
字符串 長度大於0
數字 不爲0
數組 長度大於0
其餘類型 不爲null
自定製 經過asBoolean()方法來重寫


10. forEach

for(String greet : greetings){}
for(def greet : greetings){}

不想指定類型:

for(greet in greetings){}

或者 內部迭代器 each()


10. 靜態導入支持別名

import static Math.random as rand
double value = rand()


11. java的編譯時註解被忽略,如Override。

12. groovy既支持動態類型,又支持泛型。泛型在執行時進行檢查生效。

13. Groovy能夠重載操做符,由於每一個操做符都被映射到一個標準的方法。

14. 使用註解生成代碼

@Canonical 標註於類上,用於生成toString():逗號分隔各屬性,可排除屬性

@Canonical(excludes='lastName, age')
class Person{}


@Delegate 用於引入被委託類相應的方法包裝器,用於委派任務。引入的具體實例方法與順序有關。

查找還未有的方法進行一次引入。

class Worker{
    def work(){}
    def analyze(){}
}
class Expert{
    def analyze(){}
}
class Manager{
    @Delegate Expert expert = new Expert()//引入Expert實例的analyze方法
    @Delegate Worker worker = new Worker()//引入Worker實例的work方法
}


@Immutable 標註在類上,用於便捷生成不可變值對象,即屬性final。同時提供hashCode()、equals()、toString()方法。

@Immutable
class CreditCard{
    String cardNumber
    int creditLimit
}


@Lazy 標註於屬性上,懶加載

class Heavy{}
class AsNeeded {
    @Lazy Heavy heavy = new Heavy()
}


@Singleton 標註於類上,實現單例模式

@Singleton(lazy = true)
class TheUnique{
}


15. == 

== 等於調用java的equals(),除非實現Comparable接口的類型,== 等於compareTo()

is()等於java的==


16. groovy匿名內部類使用可能會有問題,會將{……}實現體當作閉包。

相關文章
相關標籤/搜索