登录
  • 欢迎访问 Sharezer Blog

Gradle for Android 第七篇( Groovy入门 )

Gradle sharezer 1694次浏览 已收录 0个评论

原文地址 https://segmentfault.com/a/1190000004276167

这会是一个系列,所以如果你看完这篇文章,请看下列文章:

Gradle for Android 第一篇 (从 Gradle 和 AS 开始)
Gradle for Android 第二篇 (Build.gradle 入门)
Gradle for Android 第三篇 (依赖管理)
Gradle for Android 第四篇 (构建变体)
Gradle for Android 第五篇 (多模块构建)
Gradle for Android 第六篇 (测试)
Gradle for Android 第七篇 (Groovy 入门)

迄今为止,我们已经学些了众多 gradle 构建的概念以及如何运行 tasks。在这一章,我们将对这些概念有一个更深的理解,然后开始构建我们自己的 tasks。一旦我们掌握了如何编写自定义 tasks, 那么我们就可以试着编写自己的插件,以达到在多个项目中复用的目的。

在我们创建传统 tasks 之前,我们有必要了解些 Groovy 的基本语法。因为这理解 Groovy 如何运行会使得我们能更好的理解 tasks 和插件。理解 Groovy 同样帮助我们理解 Gradle 如何工作,以及为什么这些配置文件需要这样配置。

在这一章,我们将会遵循以下主题:

  • 理解 Groovy

  • 重新认识 tasks

  • Hooking Android 插件

  • 编写自定义插件

理解 Groovy

大部分 Android 开发者也是名 Java 开发者,和 Java 对比,Groovy 也是运行在 JVM 上。当然,如果你是名 Java 开发者,那么 Groovy 将会变得容易阅读,但是在编写你自己的 Groovy 代码之前,你必须对 Groovy 有一个全面的了解。

简介

Groovy 起源于 Java,其运行在 JVM 上。其目标是创造更简单,更直接的语言,不仅仅在脚本语言上或者编译语言上运行。通过这一章节,我们将对 Groovy 和 Java 进行对比。

在 Java 中,打印一天 String 应该是这样的:

System.out.println("Hello, world!");

在 Groovy 中,你可以这么写:

println 'Hello, world!'

你应该主要到几点不同之处:

  • 没有了 System.out

  • 没有了方括号

  • 列结尾没有了;

这个例子同样使用了单引号,你可以使用双引号或者单引号,但是他们有不同的用法。双引号可以包含插入语句。插入是计算一个字符串包含 placeholders 的过程,并将 placeholders 的值替换,这些 placeholder 可以是变量甚至是方法。Placeholders 必须包含一个方法或者变量,并且其被 {} 包围,且其前面有 $ 修饰。如果其只有一个单一的变量,可以只需要 $。下面是一些基本的用法:

def name = 'Andy'
def greeting = "Hello, $name!"
def name_size "Your name is ${name.size()} characters long."

greeting 应该是 “Hello,Andy”,并且 name_size 为 Your name is 4 characters long.string 的插入可以让你更好的动态执行代码。比如

def method = 'toString'
 new Date()."$method"()

这在 Java 中看起来很奇怪,但是这在 groovy 里是合法的。

Classes 和 members

Groovy 里面创建类和 Java 类似,举个例子:

class MyGroovyClass {
       String greeting
       String getGreeting() {
           return 'Hello!'
        } 
}

注意到不论是类名还是成员变量都没有修饰符。其默认的修饰符是类和方法为 public,成员变量为 private。

当你想使用 MyGroovyClass,你可以这样实例化:

def instance = new MyGroovyClass()
instance.setGreeting 'Hello, Groovy!'
instance.getGreeting()

你可以利用 def 去创建变量,一旦你为你的类创建了实例,你就可以操作其成员变量了。get/set 方法 groovy 默认为你添加 。你甚至可以覆写它。

如果你想直接使用一个成员变量,你可以这么干:

println instance.getGreeting()
 println instance.greeting

而这二种方式都是可行的。

方法

和变量一样,你不必定义为你的方法定义返回类型。举个例子,先看 java:

public int square(int num) {
       return num * num;
} 
square(2);

你需要将该方法定义为 public,需要定义返回类型,以及入参,最后你需要返回值。

我们再看下 Groovy 的写法:

def square(def num) {
       num * num
 }
 square 4

没有了返回类型,没有了入参的定义。def 代替了修饰符,方法体内没有了 return 关键字。然而我还是建议你使用 return 关键字。当你调用该方法时,你不需要括号和分号。

我们设置可以写的更简单点:

num * num } square 8 " title="" data-original-title="复制">

def square = { num ->
       num * num
}
square 8

闭包

闭包是一段匿名的方法体,其可以接受参数和返回值。它们可以定义变量或者可以将参数传给方法。

你可以简单的使用方括号来定义闭包,如果你想详细点,你也可以这么定义:

Closure square = {
       it * it
}
square 16

添加了 Closure,让其更加清晰。注意,当你没有显式的为闭包添加一个参数,groovy 会默认为你添加一个叫做 it。你可以在所有的闭包中使用 it,如果调用者没有定义任何参数,那么 it 将会是 null,这会使得你的代码更加简洁。

在 grade 中,我们经常使用闭包,例如 Android 代码体和 dependencies 也是。

Collections

在 groovy 中,有二个重要的容器分别是 lists 和 maps。

创建一个 list 很容易,我们不必初始化:

List list = [1, 2, 3, 4, 5]

为 list 迭代也很简单,你可以使用 each 方法:

println element } " title="" data-original-title="复制">

list.each() { element ->
       println element
}

你甚至可以使得你的代码更加简洁,使用 it:

list.each() {
       println it
}

map 和 list 差不多:

Map pizzaPrices = [margherita:10, pepperoni:12]

如果你想取出 map 中的元素,可以使用 get 方法:

pizzaPrices.get('pepperoni')
pizzaPrices['pepperoni']

同样的 groovy 有更简单的方式:

pizzaPrices.pepperoni

是不是简单到爆,瞬间感觉 Java 太复杂的有木有。下一章我们将学习 Groovy 在 Gradle 中的使用情况,相信你会喜欢!


Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Gradle for Android 第七篇( Groovy入门 )
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址