我是靠谱客的博主 高挑鸵鸟,这篇文章主要介绍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中在编译时完成方法的选择,基于声明类型。

复制代码
1
2
3
4
5
6
7
8
9
int method(String arg) { return 1; } int method(Object arg) { return 2; } Object o = "Object"; int result = method(o);

在Java中,将会存在:

复制代码
1
2
assertEquals(2, result);

然而在groovy中:

复制代码
1
2
assertEquals(1, result);

这是因为,Java使用静态类型信息,o被声明为Object,而Groovy则是在运行时当方法被确实调用时选择。由于它被作为String调用,于是String版本将会被调用。

3 数组初始化器

Groovy中,{…}块被保留用于闭包。这意味着不能使用如下语法创建数组字面值:

复制代码
1
2
int[] array = {1, 2, 3}

可以选择使用:

复制代码
1
2
int[] array = [1, 2, 3]

4 包范围可见性

在Groovy中,忽略字段上的修饰符并不会导致其成为Java中的包私有字段:

复制代码
1
2
3
4
class Person { String name }

这被用于创建一个属性,即私有字段以及与之关联的getter与setter。

通过注解@PackageScope可以窗机哪一个包私有字段:

复制代码
1
2
3
4
class Person { @PackageScope String name }

5 ARM块

Java 7的ARM(自动资源管理,Automatic Resourec Management)在Groovy中并不支持。但是,Groovy提供了基于闭包的不同方法,这些方法与ARM具有相同的效果并且更具惯用性。

复制代码
1
2
3
4
5
6
7
8
9
10
11
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(); }

可以被写作:

复制代码
1
2
3
4
new File('/path/to/file').eachLine('UTF-8') { println it }

或者也可以写成一个接近Java的版本

复制代码
1
2
3
4
5
6
new File('/path/to/file').withReader('UTF-8') { reader -> reader.eachLine { println it } }

翻译源:Groovy 文档

最后

以上就是高挑鸵鸟最近收集整理的关于Groovy与Java的区别(一)的全部内容,更多相关Groovy与Java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(80)

评论列表共有 0 条评论

立即
投稿
返回
顶部