资讯专栏INFORMATION COLUMN

Gradle for Android 第七篇( Groovy入门 )

jayzou / 2146人阅读

摘要:通过这一章节,我们将对和进行对比。必须包含一个方法或者变量,并且其被包围,且其前面有修饰。比如这在中看起来很奇怪,但是这在里是合法的。其默认的修饰符是类和方法为,成员变量为。在中,有二个重要的容器分别是和。

这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持!

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

Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )

Gradle for Android 第二篇( Build.gradle入门 )

Gradle for Android 第三篇( 依赖管理 )

Gradle for Android 第四篇( 构建变体 )

Gradle for Android 第五篇( 多模块构建 )

Gradle for Android 第六篇( 测试)

迄今为止,我们已经学些了众多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关键字。当你调用该方法时,你不需要括号和分号。

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

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方法:

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中的使用情况,相信你会喜欢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/12530.html

相关文章

  • Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )

    摘要:和在中的两大重要的概念,分别是和。每个有至少一个。配置阶段在该阶段,脚本将会执行,为每个创建和配置所有的。除了,还有三个基本的命令运行所以的这意味着运行所有的在已连的设备或模拟器上。在下一篇文章中,我们将会定制自己的文件。 这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! showImg(https://segmentfault.com/img/bVtdBU); ...

    MobService 评论0 收藏0
  • Gradle for Android 第六篇( 测试)

    摘要:和插件默认支持单元测试,但是在你使用它之前,你仍需配置一下。总结在这一章,我们学习了如何测试,我们学习了简单的单元测试,以及测试。 这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! showImg(https://segmentfault.com/img/bVtdBU); 这会是一个系列,所以如果你看完这篇文章,请看下列文章: Gradle for Android...

    hiyang 评论0 收藏0
  • Android-开发姿势

    摘要:微信这类怎么做谈谈八款开发者必备的小工具八款开发者必备的小工具笔记之图像压缩开发中的图像压缩是一个很重要的部分。 Android 攻城狮—全套必备神级工具(开发,插件,效率) 如果你有用的酸爽的软件,请下面留言。我会持续更新。。。 替你 总结的 Gradle 配置 关于 Gradle 配置的一些总结,欢迎交流! 常用的代码片段,不断更新 项目中平常会用到的代码片段,以及一些收集的好的代...

    jifei 评论0 收藏0
  • Gradle for Android 第二篇( Build.gradle入门 )

    摘要:第一个属性是,该属性复写了文件中的包名,但是关于和有一些不同。在文件中定义的依然被用来作为包名和文件的包名。而将被用在设备和各大应用商店中作为唯一的标示。定义为最小支持。将会作为版本号标示,而毫无作用。其中不是必须得。 这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! showImg(https://segmentfault.com/img/bVtdBU); 新年...

    wpw 评论0 收藏0
  • Gradle for Android 第三篇( 依赖管理 )

    摘要:是该的版本号,我们来看看如何申明依赖上述的代码是基于语法的,所以其完整的表述应该是这样的为你的仓库预定义为了方便,会默认预定义三个仓库和以及本地仓库。第二行,我们告诉,我们想得到最新的版本,并且其最小的版本号是第三行,我们告诉得到最新的。 这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,希望大家多多支持! showImg(https://segmentfault.com/img/b...

    hzc 评论0 收藏0

发表评论

0条评论

jayzou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<