注册

深度探索 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 个评论

写得好啊

要回复文章请先登录或注册