Groovy的方法、閉包語法,介面的實現
Context:
JavaBean是按照特定約束暴漏出屬性,缺點是要寫很多get、set。Groovy簡化了這個過程。而Gradle中task就是Groovy語言中的餓一個
Java建立JavaBean:
public class Car { private int miles; private final int year; public Car(int theYear){ year = theYear; } public int getMiles(){ return miles; } public void setMiles(int theMiles){ miles = theMiles; } public int getYear(){ return year; } public static void main(String[] args){ Car car = new Car(2008); System.out.println("Year:"+car.getYear()); System.out.println("Miles:"+car.getMiles()); System.out.println("Setting Miles"); car.setMiles(25); System.out.println("Miles:"+car.getMiles()); } }
Groovy建立JavaBean:
class Car{
def miles = 0
final year
Car(theYear){
year = theYear
}
}
Car car = new Car(2008)
println "Year: $car.year"
println "Miles: $car.miles"
println 'Setting miles'
car.miles = 25
println "Miles: $car.miles"
差異分析:
Groovy會自動為屬性建立 get、set方法。當呼叫car.miles時,並不是引用該欄位,而是呼叫該屬性的get方法。
如果屬性是final,則只建立get方法,沒有set方法。
Groovy並不區分public、private、protected,所以如果想實現java中的private屬性,就必須實現一個private的set方法,用於覆蓋自動生成的set方法。這樣外部無法set也就無法在類外部修改。
(PS: def是用來宣告屬性,$car.year 是在Groovy的字串中引用變數的方式)
Groovy初始化JavaBean:
class Robot{ def type width,height def access(location, weight, fragile){ println "Received fragile? $fragile, Weight: $weight, loc: $location" } } robot = new Robert(type: 'arm', widht: 10, height:40) robot.access(50,true, x:30, y:20, z:10) //輸出是: Received fragile? true, weight: 50, loca:[x:30, y:20, z10]
1.以逗號分割的明值對傳入建構函式實參
2.實參個數 超過 方法形參個數,而且多出的實參是名值對,那麼Groovy就吧方法的第一個形參設為Map,然後收集實參列表的名值對組織成第一個形參的值。
3.可選形參 log(x, base=10){print "$base"},呼叫log(1),就相當於base設定為10
4.末尾陣列形參視為可選 def task(name, String[] details{ }
5.多賦值,方法將多個結果放到一個數組返回,左側定義一個數組接受。方法就可以返回多個結果。
def split(fullName){ fullName.split(' ')}
def (firstName, lastName) = splitName('James Bond')
還可以用來交換變數:
def name1 = "1"
def name2 = "2"
(name1, name2) = [name1, name2]
實現介面:
1. as 關鍵字,會把所有介面中的呼叫都指向 as左側的程式碼塊,不用顯式的new OnClickListener。
button.setOnClickListener (
{println "hello"} as OnClickListener
}
也可以複用
listener = { println 'hello'}
button1.setOnClickListener(listener as OnClickListener)
2.如果介面不想全攔截,也可以指定。沒指定的ok,但是被呼叫會null pointer
hadleFocus = {
focusGained : { println "hello"}
focusLost : {println "hello"}
}
button.addFocusListener(handleFocus as FocusListener)
Gradle 中的task
task installSearch(dependsOn: 'copySearchPlug', group: 'plug_search'){println "hello"}
還是不太理解task的語法是什麼。