Groovy: 比JavaBean好用的GroovyBean

[size=x-large]Groovy: 比JavaBean好用的GroovyBean[/size]

在Java裏我們經常使用JavaBean,GroovyBean用更簡單的語法提供了JavaBean一樣的功能。 我們在JavaBean裏定義一個屬性時需要自己添加get/set方法。雖然現在的大多數IDE都可以爲我們自動生成這些方法,但是在屬性很多的情況下還是這些方法還是會影響程序的可讀性。

下面我們來先看一個GroovyBean的例子:

class Car {
int numberOfDoors
String model
String brand
boolean automatic
double price

String toString() {
"[Car details => brand: '${brand}', model: '${model}', #doors: '${numberOfDoors}', automatic: '${automatic}', price: '${price}']"
}
}



然後我們就可以在其他的Groovy類或腳本里這樣使用:


Car ford = new Car(brand: 'Ford', model: 'Focus', numberOfDoors: 4, automatic: false, price: 24995)
Car toyota = new Car(brand: 'Toyota', model: 'Verso')
toyota.automatic = true // 是的,這裏其實是在調用setAutomatic.
toyota.setPrice(28919) // 和Java的set方法一樣使用
toyota.setNumberOfDoors 5 // 因爲自由一個參數,在Groovy中可以不夠用括號
println ford // 輸出: [Car details => brand: 'Ford', model: 'Focus', #doors: '4', automatic: 'false', price: '24995.0']
println toyota // 輸出: [Car details => brand: 'Toyota', model: 'Verso', #doors: '5', automatic: 'true', price: '28919.0']


這裏的Car類就是一個GroovyBean。看上去我們好像只定義了一些字段,但是因爲我們沒有加入任何的訪問修飾(public, protected 或private) 這裏的字段實際上在編譯時會變成屬性。Groovy會自動爲這些方法生產get/set方法,所以我們可以像JavaBean的屬性一樣使用。如果想要了解詳細的編譯規則看這裏http://groovy.codehaus.org/Groovy+Beans 。通過下面的Java程序(注意是Java程序,不是Groovy程序)我們可以證明Car類實際上是一個JavaBean。


public class CarApp {
public static void main(String[] args) {
Car car = new Car();
car.setNumberOfDoors(3);
car.setModel("A3");
car.setBrand("AUDI");
car.setPrice(32010);
System.out.println(car); // 輸出: [Car details => brand: 'AUDI', model: 'A3', #doors: '3', automatic: 'false', price: '32010.0']
}
}


GroovyBean非常靈活,如果我們要讓一個property是隻讀的,只要把它聲明爲final。我們把brand聲明爲final,運行上面的Groovy腳本,就會得到下面的異常:

Caught: groovy.lang.ReadOnlyPropertyException: Cannot set readonly property: brand for class: Car


我們可以根據需要添加自己的get/set方法。例如我們把model屬性的set方法聲明爲protected。

class Car {
int numberOfDoors
String model
final String brand // Readonly, public getter is generated, no setter.
boolean automatic
double price

// Protected setter, public getter還是會自動生成.
protected void setModel(modelName) {
this.model = modelName
}

String toString() {
"[Car details => brand: '${brand}', model: '${model}', #doors: '${numberOfDoors}', automatic: '${automatic}', price: '${price}']"
}
}


要想直接方法GroovyBean中的字段,我們可以用.@運算符。用這個運算符,我們可以越過get/set方法。當然一般我們不會這麼做,因爲這正是我們使用屬性的原因(一般只有在類的內部使用)。不管怎麼我們還是看看怎麼用吧:


class Car {
int numberOfDoors
String model
String brand
boolean automatic
double price

public void setBrand(brand) {
this.brand = brand + ' set via setter method'
}

String toString() {
"[Car details => brand: '${brand}', model: '${model}', #doors: '${numberOfDoors}', automatic: '${automatic}', price: '${price}']"
}
}



Car ford = new Car(brand: 'Ford', model: 'Focus', numberOfDoors: 4, automatic: false, price: 24995)
println ford.brand // 輸出: Ford set via setter method (這裏通過get方法)

ford.@brand = 'Overrule brand'
println ford.brand // 輸出: Overrule brand (這裏通過get方法)
println ford.@brand // 輸出: Overrule brand (這裏直接方法字段)


GroovyBean提供了一種比JavaBean更加簡潔的屬性訪問機制。


http://mrhaki.blogspot.com/2009/08/groovy-goodness-groovybeans-simpler.html
發佈了15 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章