Groovy

编程语言
展开2个同名词条
订阅
订阅
0有用+1
0
Groovy是一种基于JVMJava虚拟机)的敏捷开发语言,它结合了PythonRuby和Smalltalk的许多强大的特性,是一种动态编程语言 [5-6]。Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他Java语言编写的库。它为Java开发者提供了更简洁的语法,支持动态类型转换、闭包元编程,并支持DSL领域特定语言 [6] [12]。Groovy由James Strachan等人于2003年发明 [10] [12],其当前维护者为Apache社区 [12]。Groovy将其开源授权协议从BSD更改为Apache [7]。Groovy 2.2版本于2013年11月发布。该语言特别适合与Spring的动态语言支持一起使用 [1],并广泛应用于构建脚本(如Gradle)、Web开发框架(如Grails)及测试 [6] [12]。近年来,Groovy也被集成到企业级低代码平台和业务规则引擎中,用于处理复杂业务逻辑和企业系统集成 [3] [9] [11]。在Apache Camel等集成框架中,Groovy被用作脚本语言以支持动态路由和消息处理 [3]
外文名
Groovy
类    别
编程语言
发行时间
2003年
创作者
James Strachan、Bob McWhirter

简介

播报
编辑
Groovy 是 用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,它结合了PythonRuby和S凶几巩m说旬击alltalk等语言的许多强大特性,例如动态类型白榜转换、闭包和元编程支持。 [6] [12]既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必婶煮虹编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是一种完全兼容Java语法的JVM语言,旨在为Java平台提供动态语言特性,与Java代码可以实现无缝互操作和集成。 [5] [12]该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:Groovy并非旨在替代Java,而是作为Java的有力补充,两者可以很好地结合编程。颈夜) [1]Groovy通过提供更简洁的语法、动态类型、强大的闭包功能以及对领域特定语言(DSL)的良好支持,显著提高了开发效率,特别适用于脚本编写、快速原型开发、测试以及与现代框架(如Spring、Gradle宙轿兵)的集成。 [5-6] [12]
(概述图篮催雅嘱讲酷兵片来源:)

研发背景

播报
编辑
Groovy由James Strachan和Bob McWhirter发明,首次提出于2003年,并于2004年3月作为JSR 241提交 [10] [12]。其开发目的是增强Java的生产力,通过提供更动态、简洁的语法来简化Java开发者的日常编程任务,特别是在构建脚本、测试和Web应用开发中 [12]。创始人James Strachan曾表示,如果他在2003年看过《Programming in Scala》,可能就不会发明Groovy,并认为Scala可能成为Java的替代者 [4]。目前由Apache社区维护 [12]

特性

播报
编辑

基本特点

1、 构建在强大的Java语言之上 并 添加了从PythonRubySmalltalk等语言中学到的 诸多特征,例如动态类型转换、闭包元编程(metaprogramming)支持。。
2、为Java开发者提供了 现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
3、 支持DSL(Domain Specific Languages领域特定语言)和其它简洁的语法,让代码变得易于阅读和维护。
4、受检查类型异常(Checked Exception)也可以不用捕获。
5、 Groovy拥有处理原生类型,面向对象以及一个Ant DSL,使得创建Shell Scripts变得非常简单。
6、在开发Web,GUI,数据库或控制台程序时 通过 减少框架性代码 大大提高了开发者的效率。
7、支持单元测试和模拟(对象),可以 简化测试。
8、无缝集成 所有已经存在的 Java对象和类库。
9、直接编译成Java字节码,这样可以在任何使用Java的地方 使用Groovy。 [2]
10、支持函数式编程,不需要main函数
11、一些新的运算符
12、默认导入常用的包。
13、断言不支持jvm的-ea参数进行开关。
14、支持对对象进行布尔求值。
15、类不支持default作用域,且默认作用域为public
16、groovy中基本类型也是对象,可以直接调用对象的方法。

动态类型

类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(autoboxing)). 当需要时,很多类型之间的转换都会自动发生,比如在这些类型之间的转换: 字符串(String),基本类型(如int) 和类型的包装类 (如Integer)之间,可以把不同的基本类型添加到同一数组(collections)中。

闭包

闭包就是可以使用参数的代码片段,每个闭包会被编译成继承groovy.lang.Closure类的类,这个类有一个叫call方法,通过该方法可以传递参数并调用这个闭包.它们可以访问并修改在闭包创建的范围内的变量,在闭包内创建的变量在闭包被调用的范围内同样可以被引用, 闭包可以保存在变量中并被作为参数传递到方法中。

语法

播报
编辑
Groovy 语法与Java 语言的语法很相似,虽然 Groovy 的语法源于SmalltalkRuby这类语言的理念,但是可以将它想像成 Java 语言的一种更加简单、表达能力更强的变体。(在这点上,Ruby与 Groovy 不同,因为它的语法与 Java 语法差异很大。)
许多 Java 开发人员喜欢 Groovy 代码和 Java 代码的相似性。从学习的角度看,如果知道如何编写 Java 代码,那就已经了解 Groovy 了。Groovy 和 Java 语言的主要区别是:完成同样的任务所需的 Groovy 代码比 Java 代码更少。
Groovy通过一系列语法糖和简化规则显著减少了代码量。例如,语句末尾的分号是可选的,方法中的return关键字和显式返回类型声明通常可以省略。Groovy支持动态类型,变量、属性、方法参数及返回类型无需显式声明 [6] [10]。字符串支持双引号(可嵌入${expression}表达式)和单引号两种字面量。switch语句可处理更广泛的数据类型,for循环可便捷地遍历数组、集合、Map和范围(Range) [10]。Groovy可直接编写脚本而无需定义class或main方法,并默认导入常用包(如java.lang.*, java.util.*等),减少import语句 [6]

播报
编辑
Groovy类和java类一样,完全可以用标准java bean的语法定义一个Groovy类。但作为另一种语言,可以使用更Groovy的方式定义类,这样的好处是,可以少写一半以上的javabean代码。
(1)不需public修饰符
如前面所言,Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。
(2)不需要类型说明
同样前面也说过,Groovy也不关心变量和方法参数的具体类型。
(3)不需要getter/setter方法
在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。
(4)不需要构造函数
不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数--由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。
(5)不需要return
Groovy中,方法不需要return来返回值
(6)不需要()
Groovy中方法调用可以省略()(构造函数除外)。

文件与类的关系

播报
编辑
在Groovy中类和文件的对应关系并不像Java中那么固定(Java中一个文件只能有一个声明为public的类和其他一些非公共的类和内嵌类) 。在同一个groovy文件中可以包含多个public的类定义。具体规则如下:
如果在一个groovy文件中没有任何类定义,它将被当做script来处理,也就意味着这个文件将被透明的转换为一个Script类型的类,这个自动转换得到的类将使用原始的groovy文件名(去掉扩展名,没有包名,在default包中)作为类的名字。groovy文件的内容被打包进run方法,另外在新产生的类中被加入一个main方法以进行外部执行该脚本。
如果在groovy文件正好有一个类的定义,并且该类的名字与文件名称相同,那么这就和java中的类与文件的一一对应关系相同。
在一个groovy文件中可以包含多个不同可见性的类定义,并且没有强制性的要求其中有一个类的类名与文件名相同。groovyc编译器会很乐于把该文件中定义的所有的类都编译成*.class文件。如果希望能够直接调用这个groovy script,比如说在使用groovy命令行或者在某个IDE中执行,那么应该在该文件中的第一个类中定义一个main方法。
在一个groovy文件中可以混合类的定义和脚本定义。在这种情况下,那些脚本代码将会变成直接调用的主类,所以在这种情况下不应该再定义一个和文件同名的类。
在没有经过明确的编译过程即执行时,groovy将通过文件名来查找类。在这种情况下,名称将会很重要。Groovy只能找到那些和文件名匹配的类。在找到这种名字匹配的类时,找到的文件中定义的其他类将被解析并变得对groovy可见。

应用与生态

播报
编辑
Groovy的应用场景包括Web开发、脚本编写与自动化、集成测试、数据处理和快速原型开发。 [5]

企业级系统集成

Apache Camel支持使用Groovy,例如在Predicate中使用Groovy,Groovy语言支持选项,Camel会在Groovy上下文中提供交换信息,可以自定义GroovyShell并从外部资源加载脚本。 [3]在Oracle Fusion Cloud Enterprise Performance Management中,Groovy用于编写复杂的商业规则和数据处理脚本,解决一般商业规则无法解决的使用案例。 [8-9]星云低代码平台通过集成Groovy,适用于企业现有Java系统集成、复杂业务规则引擎和高性能数据处理等场景。 [11]

核心生态工具

Groovy生态圈包括Gradle、Grails、Spock和Griffon。Gradle是自动化构建工具,Grails是用于快速Web应用开发的开源框架,Spock是测试框架,Griffon是Swing开发框架。 [6]

运营模式

播报
编辑
Groovy在2011年将其开源授权协议从BSD更改为Apache License [7]。目前,Groovy由Apache社区进行维护和发展,是Apache软件基金会的项目之一 [12]
Groovy在企业级应用中获得商业支持,例如Oracle在其企业绩效管理(EPM)云服务(包括Enterprise Performance Management Enterprise Cloud Service、PBCS等)中,将Groovy作为一种高级可定制规则框架,用于解决一般商业规则无法处理的复杂业务用例,如数据验证、动态计算脚本生成等 [8-9]

核心团队

播报
编辑
Groovy编程语言由James Strachan和Bob McWhirter共同发明 [10]。目前,该项目由Apache社区进行维护 [12]

版本信息

播报
编辑
Groovy 2.2,发布于2013年11月。 [1]