前言
前面几篇基本上对Gradle构建在Android中的使用场景和流程都有了大致了解,包括如何使用以及如何自定义插件等,这些基本都是基于官方的教程引导来了解的。接下来我们通过几篇文章来深入了解一下具体的几个核心知识点,今天就以Groovy语法为切入点,接下来几篇你可能还会看到关于标准的Gradle插件、Maven插件、自定义构建等具体的知识点相关文章。
Groovy初识
在Apache的groovy-lang.org
官网可以看到一句很醒目的话:
A multi-faceted language for the Java platform / 一个Java平台的多窗口语言
从这一句话中我们可以得知它的重要性,它可以帮助我们方便的使Java平台和其他语言交互,它也是一个面向对象的语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也符合Groovy的语法规则,尽管可能语义不同。
和Java的差异
Groovy语言在设计之初就让其可以很快速的让Java开发者使用,很多地方只会比Java更方便,而且让熟悉Java的你不感到别扭。
省略
Groovy语法允许省略分号和修改符。而且Groovy允许定义简单脚本,同时无需定义正规的class对象。
默认导包
默认情况下导入所有这些包和类,即您不必使用显式import语句来使用它们,所以在使用Groovy的时候不要导包。
|
|
没有类型的Java代码
在Java中,如果要声明一个String变量,则必须输入:
|
|
但是,如果仔细想想,就会看出,等号右侧的字符已经表明value的类型是String。所以,Groovy允许省略value前面的String类型变量,并用def代替。
|
|
调用重载方法
在Groovy中在运行期间根据实际的参数类型来调用重载方法,而Java中在编译期间根据声明类型来调用重载方法。
|
|
所以上面代码在Java中执行result的结果是2,而在Groovy中执行result的结果是1
默认public
我们知道在Java中省略类、方法、属性的可见修饰符默认为default,只有在同一个包内可见,而且不可继承。
作用域 | 当前类 | 同一个包 | 子类 | 其他包 |
---|---|---|---|---|
public | ||||
protected | ||||
default | ||||
private |
但是在Groovy中默认都是public修饰符,如果你想让字段只在同包内访问,可以使用@PackageScope
修饰符。
|
|
内部类
静态内部类和匿名内部类与Java完全一致:
|
|
非静态内部类的唯一不同就是创建实例的不同,Groovy不支持y.new X()语法。相反,你必须写new X(y):
|
|
Lambda表达式
Groovy不支持Lambda表达式语法,但有闭包替代。
不一样的String
在Groovy中用单引号的字符串是和Java相同的String对象,而用双引号的字符串不一定是String对象,因为Groovy支持GString(也就是字符串中携带变量)
|
|
不一样的双等于
在Java中使用==
来比较两个基本类型或者对象的equals(),而在Groovy中==
会被翻译成a.compareTo(b)==0
,需要实现Comparable和equals方法。如果要检查是否是相同类型则可以使用a.is(b)
酷比了的循环
在Groovy中可以使用循环范围,是不是觉得很酷呢?
|
|
如果我们要上面的循环不包括5可以使用小于号,例如:for(i in 1..<5){ }
函数默认参数
Groovy的函数中可以给函数参数定义默认值,如下下面的repeat参数:
|
|
另外值得注意的是在Groovy中什么函数参数不需要类型或者def声明。
数组初始化
在Groovy中,{ … }
块被保留用于闭包。这意味着您无法使用以下语法创建数组:
|
|
替代方式,也就是Groovy中的方法如下:
|
|
额外的关键字
Groovy中的关键字比Java中的更多。不要将它们用于变量名称。
|
|
闭包
和Java中的Lambda表达式(可以参考《Lambda编程》)不同的是,在Groovy中使用的是闭包(Closure),它是Groovy中非常重要的一个数据类型或者说一种概念了。
闭包,是一种数据类型,它代表了一段可执行的代码。语法格式def xxx = {paramters -> code}
举例如下:
|
|
从C/C++语言的角度看,闭包和函数指针很像。闭包在Groovy中大量使用,比如很多类都定义了一些函数,这些函数最后一个参数都是一个闭包。
|
|
这段代码是不是有些奇怪呢?事实上这个each()是个函数,只不过省略了括号而已(Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号)。
这个时候机智的你是不是想到了android构建中的android{ }
,这个时候理解了它原来是一个android( { } )
函数。
Groovy API
我们都知道Java语言有一套JDK来帮助我们快速开发,而Groovy语言也一样,API文档地址。
为了方便Groovy语言更好的使用Java API,另外Groovy对JDK进行了包装,具体API文档请参考这里,我们可以利用Groovy的特性方便的使用Java API,这样极大的减少了我们的学习成本。
例如上面的each()方法就在java.util.List接口中定义了。
可以看到这个Closure就是一个闭包对象基类,所以这里接收了一个闭包作为参数。
作为一门语言,Groovy是复杂的,是需要深入学习和钻研的。一本厚书甚至都无法描述Groovy的方方面面,庆幸的是在Gradle中我们使用的只是Groovy中的一些简单知识,上面这些知识基本够用了。