1. 程式人生 > >Groovy的方法、閉包語法,介面的實現

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的語法是什麼。