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 文档

猜你喜欢

转载自blog.csdn.net/qq_32165041/article/details/84066729
今日推荐