2. Groovy 语法-注释,关键字和标识符学习

2022-12-07 18:18:44 浏览数 (1)

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"

多行注释还有一种使用场景,就是在内容中进行拼接。单行注释是根据换行来判断结束的。

而多行注释是根据 */的标签来进行结束的。例如:

代码语言:javascript复制
println 1 /* one */   2 /* two */

不会影响输出结果为3 这个值。

PS:有些人写的注释就会糅杂在代码段中。我们要学会区分。否则很清晰的代码。我们错误理解成复杂的情况。

最后,还有一个特殊注释就是:文档注释(文档注释,主要是通过doc工具生成文档时程序会自动提取文档注释内容,不会抓取单行注释和多行注释的内容)

规范性写法中,文档注释通常在函数,静态变量,类等地方进行标注。而不会针对具体代码中的某个地方进行解释。

代码语言:javascript复制
/**
 * 这是一个类的文档注释
 */
class Person {
    /** 这是一个变量的文档注释 */
    String name

    /**
     * 这是一个函数的文档注释
     *
     * @param otherPerson 介绍入参信息
     * @return 介绍返回值信息
     */
    String greet(String otherPerson) {
       "Hello ${otherPerson}"
    }
}

有别于多行注释,文档注释必须是:/** 进行开头哦。每行开头都需要*号进行标注。最后结尾和多行注释一样通过*/结束。

  1. 现在各种编译器中,对于文档注释都会有自动补全。我们输入开头/** 后按回车就会自动补全结尾了。比较方便。
  2. 我们也有必要养成文档注释的编写习惯。单行注释和多行注释我们可以少写,但是文档注释建议大家尽量写。
  3. 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中就没有。

其中:constgotostrictfpthreadsafe是属于保留字段,在现在(起码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行。

0 人点赞