1.Groovy是什么?
Groovy...
- 是一种用于Java虚拟机的灵活动态语言
- 基于Java的优势,但受Python、Ruby和Smalltalk等语言的启发,它还具有其他强大功能
- 使Java开发人员可以使用几乎零学习曲线的现代编程功能
- 提供静态类型检查和静态编译代码的能力,以提高健壮性和性能
- 支持特定于域的语言和其他紧凑语法,因此您的代码易于阅读和维护
- 凭借强大的处理原语、面向对象能力和Ant DSL,编写shell和构建脚本变得非常容易
- 通过在开发web、GUI、数据库或控制台应用程序时减少脚手架代码,提高开发人员的工作效率
- 通过支持单元测试和开箱即用模拟简化测试
- 与所有现有Java类和库无缝集成
- 直接编译为Java字节码,因此您可以在任何可以使用Java的地方使用它
2. 语法
2.1注释
单行注释
单行注释以 //
开头,可以在行中的任何位置找到。后面的字符,直到行尾,都被视为注释的一部分。
// a standalone single line comment
println "hello" // a comment till the end of the line
多行注释
多行注释以/*
开头,可以在行中的任何位置找到。后面的字符将被视为注释的一部分,包括新行字符,直到第一个关闭注释*/
为止。因此,多行注释可以放在语句的末尾,甚至可以放在语句中。
/* a standalone multiline comment
spanning two lines */
println "hello" /* a multiline comment starting
at the end of a statement */
println 1 /* one */ + 2 /* two */
Groovydoc comment
与多行注释类似,Groovydoc 注释是多行的,但以/**
开头和*/
结尾。第一个 Groovydoc 注释行之后的行可以选择以星号开头。这些评论与以下方面相关联:
类型定义(类、接口、枚举、注释),
字段和属性定义
方法定义
尽管编译器不会抱怨 Groovydoc 注释未与上述语言元素相关联,但您应该在这些构造前面附加注释。
/**
* A Class description
*/
class Person {
/** the name of the person */
String name
/**
* Creates a greeting method for a certain person.
*
* @param otherPerson the person to greet
* @return a greeting message
*/
String greet(String otherPerson) {
"Hello ${otherPerson}"
}
}
Groovydoc遵循与Java自己的Javadoc相同的约定。因此,您将能够使用与Javadoc相同的标签。
此外,Groovy 从 3.0.0 开始就支持 Runtime Groovydoc,即 Groovydoc 可以在运行时保留。
运行时 Groovydoc 在默认情况下处于禁用状态。可以通过添加JVM选项来启用它-Dgroovy.attach.runtime.groovydoc=true
运行时 Groovydoc 以/**@
开头,并以*/
结尾,例如:
/**@
* Some class groovydoc for Foo
*/
class Foo {
/**@
* Some method groovydoc for bar
*/
void bar() {
}
}
assert Foo.class.groovydoc.content.contains('Some class groovydoc for Foo')
assert Foo.class.getMethod('bar', new Class[0]).groovydoc.content.contains('Some method groovydoc for bar')
Shebang line
除了单行注释之外,还有一个特殊的行注释,通常称为 UNIX 系统可以理解的 shebang 行,它允许直接从命令行运行脚本,前提是您已经安装了 Groovy 发行版并配置了groovy的环境变量
#!/usr/bin/env groovy
println "Hello from the shebang line"
#
该字符必须是文件的第一个字符。任何缩进都会导致编译错误。
2.2 关键字
Groovy 具有以下保留关键字:
表 1. 保留关键字
abstract | assert | break | case |
---|---|---|---|
catch | class | const | continue |
def | default | do | else |
enum | extends | final | finally |
for | goto | if | implements |
import | intanceof | interface | native |
new | none | non-sealed | package |
public | protected | private | return |
static | strictfp | super | switch |
synchronized | this | threadsafe | throw |
throws | transient | try | while |
其中, const
、goto
、strictfp
和threadsafe
当前未在使用中
保留关键字通常不能用于变量、字段和方法名称。
一个技巧允许通过在引号中将名称括起来来定义与关键字同名的方法,如以下示例所示:
// reserved keywords can be used for method names if quoted
def "abstract"() { true }
// when calling such methods, the name must be qualified using "this."
this.abstract()
使用此类名称可能会造成混淆,通常最好避免使用。该技巧主要用于启用某些 Java 集成场景和某些 DSL场景,在这些场景中,具有与关键字同名的“动词”和“名词”可能是可取的。
此外,Groovy 还具有以下上下文关键字:
表 2. 上下文关键字
as | in | permits | record |
---|---|---|---|
sealed | trait | var | yields |
这些单词只是某些上下文中的关键字,在某些地方可以更自由地使用,特别是对于变量,字段和方法名称。
这种额外的宽容允许使用在早期版本的Groovy中不是关键字的方法或变量名称,或者在Java中不是关键字。示例如下所示:
// contextual keywords can be used for field and variable names
def as = true
assert as
// contextual keywords can be used for method names
def in() { true }
// when calling such methods, the name only needs to be qualified using "this." in scenarios which would be ambiguous
this.in()
熟悉这些上下文关键字的时髦程序员可能仍然希望避免使用这些名称,除非有充分的理由使用这样的名称。
对保留关键字的限制也适用于基元类型、布尔文本和空文本:
表3:其他保留字
null | true | false | boolean |
---|---|---|---|
char | byte | short | int |
long | float | double |
虽然不建议这样做,但可以使用与保留关键字相同的技巧:
def "null"() { true } // not recommended; potentially confusing
assert this.null() // must be qualified
使用此类单词作为方法名称可能会造成混淆,通常最好避免,但是,对于某些类型的DSL可能很有用。