Groovy與Java的區別(一)
阿新 • • 發佈:2018-11-16
與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
}
}