1. 程式人生 > >Groovy與Java的區別(一)

Groovy與Java的區別(一)

與Java的區別


對於Java開發者,Groovy儘可能變得自然。Groovy在被設計時盡力遵守最小驚喜原則,特別是對於來自Java背景的學習Groovy的開發者。

1 預設引入

以下包與類預設引入,即,不需要使用顯式import語句來使用它們:

  • java.io.*
  • java.lang.*
  • java.math.BigDecimal
  • java.math.BigInteger
  • java.net.*
  • java.util.*
  • groovy.lang.*
  • groovy.util.*

2 多方法

Grovvy在執行時選擇呼叫的方法。這被成為執行時排程或多方法。這意味著,方法的選擇基於執行時引數的型別。這與Java有所不同,Java中在編譯時完成方法的選擇,基於宣告型別。

int method(String arg) {
	return 1;
}
int method(Object arg) {
	return 2;
}
Object o = "Object";
int result = method(o);

在Java中,將會存在:

assertEquals(2, result);

然而在groovy中:

assertEquals(1, result);

這是因為,Java使用靜態型別資訊,o被宣告為Object,而Groovy則是在執行時當方法被確實呼叫時選擇。由於它被作為String呼叫,於是String版本將會被呼叫。

3 陣列初始化器

Groovy中,{…}塊被保留用於閉包。這意味著不能使用如下語法建立陣列字面值:

int[] array = {1, 2, 3}

可以選擇使用:

int[] array = [1, 2, 3]

4 包範圍可見性

在Groovy中,忽略欄位上的修飾符並不會導致其成為Java中的包私有欄位:

class Person {
	String name
}

這被用於建立一個屬性,即私有欄位以及與之關聯的getter與setter。

通過註解@PackageScope可以窗機哪一個包私有欄位:

class Person {
	@PackageScope
String name }

5 ARM塊

Java 7的ARM(自動資源管理,Automatic Resourec Management)在Groovy中並不支援。但是,Groovy提供了基於閉包的不同方法,這些方法與ARM具有相同的效果並且更具慣用性。

Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
	String line;
	while((line = reader.readLine()) != null) {
		System.out.println(line);
	}
} catch(IOException e) {
	e.printStackTrace();
}

可以被寫作:

new File('/path/to/file').eachLine('UTF-8') {
	println it
}

或者也可以寫成一個接近Java的版本

new File('/path/to/file').withReader('UTF-8') { reader ->
	reader.eachLine {
		println it
	}	
}

翻譯源:Groovy 文件