注册

深度探索 Gradle 自动化构建技术(二、Groovy 筑基篇)(1)

前言


成为一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~。


Groovy 作为 Gradle 这一强大构建工具的核心语言,其重要性不言而喻,但是 Groovy 本身是十分复杂的,要想全面地掌握它,我想几十篇万字长文也无法将其彻底描述。所幸的是,在 Gradle 领域中涉及的 Groovy 知识都是非常基础的,因此,本篇文章的目的是为了在后续深入探索 Gradle 时做好一定的基础储备。


一、DSL 初识


DSL(domain specific language),即领域特定语言,例如:Matliba、UML、HTML、XML 等等 DSL 语言。可以这样理解,Groovy 就是 DSL 的一个分支。


特点



  • 1)、解决特定领域的专有问题。
  • 2)、它与系统编程语言走的是两个极端,系统编程语言是希望解决所有的问题,比如 Java 语言希望能做 Android 开发,又希望能做服务器开发,它具有横向扩展的特性。而 DSL 具有纵向深入解决特定领域专有问题的特性。

总的来说,DSL 的 核心思想 就是:“求专不求全,解决特定领域的问题”。


二、Groovy 初识


1、Groovy 的特点


Groovy 的特点具有如下 三点:



  • 1)、Groovy 是一种基于 JVM 的敏捷开发语言。
  • 2)、Groovy 结合了 Python、Ruby 和 Smalltalk 众多脚本语言的许多强大的特性。
  • 3)、Groovy 可以与 Java 完美结合,而且可以使用 Java 所有的库。

那么,在已经有了其它脚本语言的前提下,为什么还要制造出 Grvooy 语言呢?


因为 Groovy 语言相较其它编程语言而言,其 入门的学习成本是非常低的,因为它的语法就是对 Java 的扩展,所以,我们可以用学习 Java 的方式去学习 Groovy。


2、Groovy 语言本身的特性


其特性主要有如下 三种:



  • 1)、语法上支持动态类型,闭包等新一代语言特性。并且,Groovy 语言的闭包比其它所有语言类型的闭包都要强大。
  • 2)、它可以无缝集成所有已经存在的 Java 类库,因为它是基于 JVM 的。
  • 3)、它即可以支持面向对象编程(基于 Java 的扩展),也可以支持面向过程编程(基于众多脚本语言的结合)。

需要注意的是,在我们使用 Groovy 进行 Gradle 脚本编写的时候,都是使用的面向过程进行编程的


3、Groovy 的优势


Groovy 的优势有如下 四种:



  • 1)、它是一种更加敏捷的编程语言:在语法上构建除了非常多的语法糖,许多在 Java 层需要写的代码,在 Groovy 中是可以省略的。因此,我们可以用更少的代码实现更多的功能。
  • 2)、入门简单,但功能非常强大。
  • 3)、既可以作为编程语言也可以作为脚本语言
  • 4)、熟悉掌握 Java 的同学会非常容易掌握 Groovy。

4、Groovy 包的结构



Groovy 官方网址



从官网下载好 Groovy 文件之后,我们就可以看到 Groovy 的目录结构,其中我们需要 重点关注 bin 和 doc 这个两个文件夹


bin 文件夹


bin 文件夹的中我们需要了解下三个重要的可执行命令文件,如下所示:



  • 1)、groovy 命令类似于 Java 中的 java 命令,用于执行 groovy Class 字节码文件。
  • 2)、groovyc 命令类似于 Java 中的 javac 命令,用于将 groovy 源文件编译成 groovy 字节码文件。
  • 3)、groovysh 命令是用来解释执行 groovy 脚本文件的。

doc 文件夹


doc 文件夹的下面有一个 html 文件,其中的 api 和 documentation 是我们需要重点关注的,其作用分别如下所示:



  • api:groovy 中为我们提供的一系列 API 及其 说明文档。
  • documentation:groovy 官方为我们提供的一些教程。

5、Groovy 中的关键字


下面是 Groovy 中所有的关键字,命名时尤其需要注意,如下所示:


as、assert、break、case、catch、class、const、continue、def、default、
do、else、enum、extends、false、finally、for、goto、if、implements、
import、in、instanceof、interface、new、null、package、return、super、
switch、this、throw、throws、trait、true、try、while
复制代码

6、Groovy && Java 差异学习


1)、getter / setter


对于每一个 field,Groovy 都会⾃动创建其与之对应的 getter 与 setter 方法,从外部可以直接调用它,并且 在使⽤ object.fieldA 来获取值或者使用 object.fieldA = value 来赋值的时候,实际上会自动转而调⽤ object.getFieldA() 和 object.setFieldA(value) 方法


如果我们不想调用这个特殊的 getter 方法时则可以使用 .@ 直接域访问操作符


2)、除了每行代码不用加分号外,Groovy 中函数调用的时候还可以不加括号。


需要注意的是,我们在使用的时候,如果当前这个函数是 Groovy API 或者 Gradle
API 中比较常用的,比如 println,就可以不带括号。否则还是带括号。不然,Groovy 可能会把属性和函数调用混淆


3)、Groovy 语句可以不用分号结尾。


4)、函数定义时,参数的类型也可以不指定。


5)、Groovy 中函数的返回值也可以是无类型的,并且无返回类型的函数,其内部都是按返回 Object 类型来处理的。


6)、当前函数如果没有使用 return 关键字返回值,则会默认返回 null,但此时必须使用 def 关键字。


7)、在 Groovy 中,所有的 Class 类型,都可以省略 .class。


8)、在 Groovy 中,== 相当于 Java 的 equals,,如果需要比较两个对象是否是同一个,需要使用 .is()。


9)、Groovy 非运算符如下:


assert (!"android") == false                      
复制代码

10)、Groovy 支持 ** 次方运算符,代码如下所示:


assert  2 ** 3 == 8
复制代码

11)、判断是否为真可以更简洁:


    if (android) {}
复制代码

12)、三元表达式可以更加简洁:


// 省略了name
def result = name ?: "Unknown"
复制代码

13)、简洁的非空判断


println order?.customer?.address
复制代码

14)、使用 assert 来设置断言,当断言的条件为 false 时,程序将会抛出异常。


15)、可以使用 Number 类去替代 float、double 等类型,省去考虑精度的麻烦。


16)、switch 方法可以同时支持更多的参数类型。


注意,swctch 可以匹配列表当中任一元素,示例代码如下所示:


// 输出 ok
def num = 5.21
switch (num) {
case [5.21, 4, "list"]:
return "ok"
break
default:
break
}

作者:jsonchao
链接:https://juejin.cn/post/6844904128594853902
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1 个评论

写得好啊

要回复文章请先登录注册