Groovy 以其簡潔靈活的語法,將開發者從繁瑣的 Java 樣板代碼中解放出來,讓程式設計師能專注於核心業務邏輯。本文透過一系列 Java 與 Groovy 代碼的並列對比,展示這門 JVM 動態語言如何大幅減少冗餘、降低複雜度,並提升代碼可讀性與維護性。
傳統 JavaBean 需為每個私有屬性手寫 getter/setter,導致代碼量膨脹。以一個代表自行車的 Bike 類為例,Java 版本需超過 60 行代碼定義 6 個屬性及其存取方法,而 Groovy 版本僅需 20 行左右:
class Bike {
String manufacturer
String model
Integer frame
String serialNo
Double weight
String status
BigDecimal cost
public void setCost(BigDecimal newCost) {
cost = newCost.setScale(3, BigDecimal.ROUND_HALF_UP)
}
public String toString() {
return \"\"\"Bike:
manufacturer -- ${manufacturer}
model -- ${model}
frame -- ${frame}
serialNo -- ${serialNo}
\"\"\"
}
}
Groovy 預設為所有屬性自動生成 public 存取器,開發者只需在需要特殊邏輯(如 setCost 的四捨五入)時覆寫對應方法。這體現了 Groovy 的核心哲學:讓常見的編碼模式變得簡單。
Groovy 支援命名參數建構語法,無需為不同參數組合編寫多個建構子:
def b = new Bike(manufacturer: "Shimano", model: "Roadmaster")
測試代碼同樣受益於屬性存取簡寫(b.model 等同於 b.getModel()),減少樣板代碼干擾。
在自行車租賃店範例中,Java 版本需定義 RentABike 介面並實現 ArrayListRentABike,且查找車輛需手寫迭代器邏輯。Groovy 版本直接省略介面,利用鴨子類型實現多態,並以閉包簡化集合操作:
public class ArrayListRentABike {
String storeName
List bikes = []
public ArrayListRentABike() {
bikes << new Bike(manufacturer: "Shimano", model: "Roadmaster", frame: 20, serialNo: "11111", weight: 15, status: "Fair")
bikes << new Bike(manufacturer: "Cannondale", model: "F2000", frame: 18, serialNo: "22222", weight: 12, status: "Excellent")
bikes << new Bike(manufacturer: "Trek", model: "6000", frame: 19, serialNo: "33333", weight: 12.4, status: "Fair")
}
public String toString() { "Store Name:=" + storeName }
def getBike(serialNo) { bikes.find { it.serialNo == serialNo } }
}
<< 運算子重載替代 add(),find 閉包替代迭代器,代碼意圖一目瞭然。命名參數建構子更讓屬性對應關係顯性化,避免參數順序錯誤。
命令列視圖類 CommandLineView 在 Groovy 中僅需 6 行代碼,以 def 關鍵字聲明依賴,無需介面綁定,Spring 仍能正確注入實現:
public class CommandLineView {
def rentaBike
def printAllBikes() {
println rentaBike
rentaBike.bikes.each { println it }
}
}
Spring 組裝類同樣受益於鴨子類型,獲取 Bean 時無需強制轉型。Groovy 與 Spring 的結合,讓動態語言的靈活性無縫融入企業級應用架構。
Groovy 通過預設屬性語義、鴨子類型、閉包集合操作、運算子重載等特性,從語言層面消除了 Java 固有的樣板代碼。無論是領域模型、服務層還是視圖層,代碼量均大幅減少,可讀性顯著提升。對於追求開發效率與代碼質量的團隊,Groovy 是極具吸引力的選擇。