1. 前言
Groovy学习的第二篇了解Groovy的语言规范。
它虽然可以直接使用Java代码进行编译,但是还是有部分和java语言的差异性。这里就是介绍Groovy的一些语言规范。学习Groovy的语法规则。
2. 语法
2.1 注释-comments
Groovy和Java是一样的注释逻辑,分为多行注释,单行注释,文档注释。采用的关键字也是://
, /*
和/**
。
同时,还有一个Groovy的特殊注释shebang行。
单行注释如下所示:
代码语言:javascript复制//这是一个单行注释 下面将会输出打印 zinyan.com 字符串。
println "zinyan.com"
多行注释如下:
代码语言:javascript复制/* 这是一个多行行注释
下面将会输出打印 zinyan.com 字符串。
*/
println "zinyan.com"
多行注释还有一种使用场景,就是在内容中进行拼接。单行注释是根据换行来判断结束的。
而多行注释是根据 */
的标签来进行结束的。例如:
println 1 /* one */ 2 /* two */
不会影响输出结果为3
这个值。
PS:有些人写的注释就会糅杂在代码段中。我们要学会区分。否则很清晰的代码。我们错误理解成复杂的情况。
最后,还有一个特殊注释就是:文档注释(文档注释,主要是通过doc工具生成文档时程序会自动提取文档注释内容,不会抓取单行注释和多行注释的内容)
规范性写法中,文档注释通常在函数,静态变量,类等地方进行标注。而不会针对具体代码中的某个地方进行解释。
代码语言:javascript复制/**
* 这是一个类的文档注释
*/
class Person {
/** 这是一个变量的文档注释 */
String name
/**
* 这是一个函数的文档注释
*
* @param otherPerson 介绍入参信息
* @return 介绍返回值信息
*/
String greet(String otherPerson) {
"Hello ${otherPerson}"
}
}
有别于多行注释,文档注释必须是:/**
进行开头哦。每行开头都需要*
号进行标注。最后结尾和多行注释一样通过*/
结束。
- 现在各种编译器中,对于文档注释都会有自动补全。我们输入开头
/**
后按回车就会自动补全结尾了。比较方便。 - 我们也有必要养成文档注释的编写习惯。单行注释和多行注释我们可以少写,但是文档注释建议大家尽量写。
- Java中的注释方法和Groovy的注释方法是一样的,也是这样进行区分的。
2.1.1 Runtime Groovydoc
Groovy从3.0.0版本开始,就支持在运行时保留文档注释(Groovydoc)。
默认情况下,这个功能是关闭的状态。我们如果需要开启的话:
在JVM启动选项配置中,添加下面的内容
代码语言:javascript复制-Dgroovy.attach.runtime.groovydoc=true
运行时Groovydoc以/**@开始,以*/结束,例如:
代码语言:javascript复制/**@
* 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')
PS: 我也没有弄明白这个运行时注释,到底有啥意义。
2.1.2 Shebang 行 #!
这个常见于Unix系统的一种注释表示。也叫做Hashbang Line
。我们如果对Python 或者Script等脚本熟悉的话。
那么比较了解这个注释了,这个注释在实际运行过程中是有作用的。它会决定运行环境。通常是使用#!
标注。
我们如果在Groovy代码中添加了该注释它将会允许从命令行直接运行脚本,前提是我们已经安装了Groovy发行版,并且在PATH上可以使用Groovy命令。(也就是在环境变量中配置了Groovy SDK的地址)。
示例:
代码语言:javascript复制#!/usr/bin/env groovy
println "Hello from the shebang line"
#
字符必须是文件的第一个字符。任何缩进都会导致编译错误。
有关注释方面的就到这里结束了。
官网链接地址为:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_cmments
2.2 关键字-keywords
Groovy有以下基本保留关键字:
abstract | assert | break | case |
---|---|---|---|
catch | class | const | continue |
def | default | do | else |
enum | extends | final | finally |
for | goto | if | implements |
import | instanceof | interface | native |
new | null | non-sealed | package |
public | protected | private | return |
static | strictfp | super | switch |
synchronized | this | threadsafe | throw |
throws | transient | try | while |
有些关键字其实和java中是一样的,但是有些是groovy特有的例如def
在java中就没有。
其中:const
,goto
,strictfp
和threadsafe
是属于保留字段,在现在(起码4.0.6版)都还没有被使用。
而保留的这些关键字,不能用于变量,字段和方法名。
2.2.1 使用保留字段
某些Java集成场景和某些DSL场景,在这些场景中,“动词”和“名词”的名称可能与关键字相同。
也就是说它需要使用保留字段作为方法名,也有一种命名方式可以实现:
代码语言:javascript复制// 如果方法名被引用,则可以使用保留关键字
def "abstract"() { true }
// 在调用此类方法时,必须使用“this”对名称进行限定。
this.abstract()
2.2.2 上下文关键字-Contextual Keywords
除了上面的保留关键字,还有上下文关键字:
as | in | permits | record |
---|---|---|---|
sealed | trait | var | yields |
这些词只是某些上下文中的关键字,在某些地方可以更自由地使用,特别是对于变量、字段和方法名。
这种额外的宽容度允许使用在Groovy早期版本中不是关键字或在Java中不是关键字的方法或变量名。例子如下:
代码语言:javascript复制// 上下文关键字可以用于字段和变量名
def as = true
assert as
// 上下文关键字可以用于方法名
def in() { true }
// 调用此类方法时,需要使用"this."对名称进行限定,否则会产生歧义.
this.in()
虽然说可以使用上下文关键字,但是除非有必须使用的理由,不建议大家使用关键字进行命名。因为容易造成误解。
2.2.3 数据变量关键字
还有些关键字是使用在变量命名中的,groovy可以使用def实行动态数据类型,但是也可以使用下面的关键字,定义指定的数据类型。
null | true | false | boolean |
---|---|---|---|
char | byte | short | int |
long | float | double |
和上面的使用方法一样, 虽然不推荐大家将这些关键字用在函数等命名上。但是如果有必须使用的场景下,也是可以使用的:
代码语言:javascript复制def "null"() { true }
assert this.null() //使用的时候也要通过this.进行引用限定。
使用这样的词作为方法名可能会引起混淆,通常最好避免使用,但是它可能对某些类型的dsl(也就是其他脚本工具中定义的DSL必须用到这个命名的方法了)有用。
官网链接地址为:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_keywords
2.3 标识符-Identifiers 命名规范
在Groovy中标识符分两种:Normal identifiers(正常标识符),Quoted identifiers(引用标识符)。
在正常标识符中:以字母、美元或下划线开头。他们不能从数字开始。接下来的字符可以包含字母和数字。
标识符的说法比较正式,通俗解释,就是我们给变量命名的时候名称规范。这个命名就是标识符。
例如符合规范的命名方式:
代码语言:javascript复制def name
def item3
def with_underscore
def $dollarStart
禁止使用的的命名方式:
代码语言:javascript复制def 3tier
def a b
def a#b
当跟在一个点后面时,所有关键字也是有效的标识符:
代码语言:javascript复制foo.as
foo.assert
foo.break
foo.case
foo.catch
2.3.1 引用标识符-Quoted identifiers
带引号的标识符出现在带点的表达式的点之后。例如,person.name
表达式的名称部分可以用person.“名字”
或person.'名字'
。
当某些标识符包含Java语言规范禁止的非法字符,但Groovy在引用时允许时,这就特别有趣了。例如,像破折号、空格、感叹号等字符。
代码语言:javascript复制def map = [:]
map."an identifier with a space and double quotes" = "ALLOWED"
map.'with-dash-signs-and-single-quotes' = "ALLOWED"
assert map."an identifier with a space and double quotes" == "ALLOWED"
assert map.'with-dash-signs-and-single-quotes' == "ALLOWED"
正如我们将在下面关于字符串的部分中看到的,Groovy提供了不同的字符串字面量。所有类型的字符串实际上都可以在点后面:
代码语言:javascript复制map.'single quote'
map."double quote"
map.'''triple single quote'''
map."""triple double quote"""
map./slashy string/
map.$/dollar slashy string/$
普通字符串和Groovy的GString(插值字符串)之间有一个区别,在后一种情况下,插值值被插入到最后的字符串中,用于计算整个标识符:
代码语言:javascript复制def firstname = "zin"
map."yan-${firstname}" = "zin yan"
assert map.'yan-zin' == "zin yan"
官网链接地址为:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#_identifiers
3. 小结
梳理和了解一下Groovy中的注释规范,一些常见关键字和变量命名规范。
通过这个的学习,第一次针对#!
注解了解了它的定义和命名shebang行。