使用Kotlin开发Android应用(III):扩展函数和默认值

使用Kotlin开发Android应用(III):扩展函数和默认值

@author ASCE1885的 Github 简书 微博 CSDN

原文链接

通过前面两篇文章,我们学习了Kotlin的基本知识,并知道如何配置工程,本文将接着介绍Java没有的而Kotlin实现了的有趣的特性。记住当你对Kotlin语言有任何疑问时,请参考官方指南。该指南组织的很好,而且容易理解,本文将不会介绍语言的基本知识。

扩展函数

Kotlin的扩展函数功能使得我们可以为现有的类添加新的函数,而不用修改原来的类。例如,我们可以为一个activity添加一个新函数,用于显示一个toast:

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){?
    Toast.makeText(this, message, duration)?.show()
}

我们可以在任何地方声明这个函数(例如在一个utils文件中),然后像使用普通函数一样在这个activity中使用它:

override fun onCreate(savedInstanceState: Bundle?) {
    super<BaseActivity>.onCreate(savedInstanceState)?
    toast("This is onCreate!!")?
}

声明一个扩展函数很简单,只需要在函数名之前添加指定的类名即可。在调用时,该函数会以导入的方式添加到这个类中。

扩展函数帮助我们简化代码,并极大的利用封闭的类。不过我们要小心并且不过度使用它。使用扩展函数的一个结果是它通常用于替代工具类。工具函数是静态的而且不能被mocked,因此过度使用工具函数通常是我们懒得创建托管类的结果。

下面是另一个有趣的例子,用于解释另一个有趣的概念:具体化(reified)类型。

inline public fun <reified T : Activity> Activity.navigate(id: String) {?
    val intent = Intent(this, javaClass<T>())
?    intent.putExtra("id", id)
?    startActivity(intent)?
}

内联函数可以使用具体化(reified)类型,这意味着我们可以在一个函数内部通过类型来恢复一个类,而不是将类的类型作为一个参数传入。

內联函数和普通函数有一点区别。內联函数在编译期间会进行代码替换,而不是真的进行函数调用。在某些情况下可以简化问题。例如,如果我们有一个函数会作用参数进行传递,普通函数会在内部创建一个包含这个函数的对象;而內联函数将会在函数被调用的地方使用代码直接替换函数调用,因此不需要创建一个内部对象。

navigate<DetailActivity>("2")

使用reified类型,我们可以在一个函数内部创建一个intent,并使用扩展函数,这样我们可以直接调用startActivity()。

可选参数和默认值

借助于参数和构造函数的默认值,你将不再需要进行函数重载了。一个函数声明就可以满足你所有的需求。让我们回到toast的例子:

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){?
    Toast.makeText(this, message, duration)?
}

第二个参数表示toast的显示持续时间,这是一个可选参数,但没有显式指定时,将使用默认的Toast.LENGTH_SHORT。因此,你有两种方式调用这个函数:

toast("Short Toast!!")
toast("Long Toast!!", Toast.LENGTH_LONG)

回到前面第二个例子,我们可能想要增加几个参数来支持lollipop动画:

inline public fun <reified T : Activity> Activity.navigate(
?        id: String,?
        sharedView: View? = null,
?        transitionName: String? = null) {??
    ...

现在我们有两种方式调用同一个函数:

navigate<DetailActivity>("2")
navigate<DetailActivity>("2", sharedView, TRANSITION_NAME)

甚至还有第三种方式,在这种情况下意义不大,但有助于帮助我们理解另一个概念:我们可以使用参数名字来决定哪个参数会被调用:

navigate<DetailActivity>(id = "2", transitionName = TRANSITION_NAME)

可选参数也可以被用在默认构造函数中,因此,你可以只声明一个构造函数,但会得到很多重载。自定义views是一个特殊例子,在Java中它们需要多于一个构造函数以便正确的运行,我会在下一篇文章中进行介绍。

总结

使用扩展函数以及可选参数和默认值,我们可以节省很多代码,甚至完成在Java中无法做到的事情。Kotlin真的更具表达性而且简洁。下一篇文章将会介绍Kotlin的Android扩展,它使得我们可以在activities中自动注入views,同时也会介绍使用Kotlin创建自定义views。

请记得查看实际运行我们的Demo例子,实践出真知。

文末摄影鉴赏

时间: 2024-10-24 14:25:15

使用Kotlin开发Android应用(III):扩展函数和默认值的相关文章

用Kotlin开发Android应用(I):介绍

关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Kotlin for Android (I): Introduction(http://antonioleiva.com/kotlin-for-android-introduction/) 原文作者:Antonio Leiva(http://antonioleiva.com/about/) 原文发布:2

使用Kotlin开发Android应用(IV):自定义视图和Android扩展

使用Kotlin开发Android应用(IV):自定义视图和Android扩展 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotlin的局限性时,我们提到了在Kotlin早期版本(M10之前)是不支持自定义视图的,因为当时只能为每个类创建一个构造函数.这通常是足够的,

使用Kotlin开发Android

查看我的全部开源项目[开源实验室] 欢迎加入我的QQ群:[201055521],本博客客户端源码下载[请点击] 摘要 我首先声明我并没有使用Kotlin很长时间,我几乎是在学习的同时写了这些文章的.我并没有尝试任何其它的替 代语言,例如Go和Scala,所以如果你是真的考虑换一种开发语言的话,我建议你去搜索一下其他人对这些 语言的评价. 本文原创,转载请注明地址:http://blog.kymjs.com/ 正文 最近,新了解了一门编程语言,叫做Kotlin.Kotlin是Jetbrains公司

用Kotlin开发android平台语音识别,语义理解应用(olamisdk)

用Kotlin开发android平台语音识别,语义理解应用(olamisdk) http://blog.csdn.net/ls0609/article/details/75084994

使用Kotlin开发Android应用初体验

使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之前,很多同学一定有很多疑问,Kotlin到底有啥好处,怎么和现有的项目共存呢?Java那么些特性Kotlin都有吗?嗯,让我们一一来看. 以下内容摘自:Kotlin的官方网站:https://www.kotlincn.net/docs/reference/android-overview.html

即刻开始使用Kotlin开发Android的12个原因(KAD 30)

作者:Antonio Leiva 时间:Jul, 11, 2017 原文链接:https://antonioleiva.com/reasons-kotlin-android/ 这组文章已到最后了,它们是非常实用的.今天我想谈谈为什么我认为学习Kotlin是非常有趣的. 虽然, Kotlin现在已是官方支持的开发Android APP的编程语言,而你仍可能觉得没有足够的理由进行改变.在这些年以来,Java已经证明其能力,为什么要改变? 这是我认为转换到Kotlin不是一个冒险的赌注,而是你可以做的

用 Kotlin 开发 Android 项目的感受

原文:http://www.jianshu.com/p/8a1fce6fa93a 和 http://www.jianshu.com/p/b444aea1b038 空指针安全 简单一点的例子,那就是 String 和 String? 是两种不同的类型.String 已经确定是不会为空,一定有值:而 String?则是未知的,也许有值,也许是空.在使用对象的属性和方法的时候,String 类型的对象可以毫无顾忌的直接使用,而 String?类型需要你先做非空判断. fun demo() {    

IDEA基于kotlin开发android程序配置小结

IDEA功能极其强大,和微软的宇宙第一IDE不相上下.用了很长时间,对它配置的完善性产生了近乎迷信的感情.似乎只要走正常渠道,用它来配置,没有不成功的. IDEA是开发android原生程序的利器,android studio即是基于IDEA开发的工具.AndroidStudio能干的,IDEA同样能干的很好.kotlin是jetbrain开发的语言,堪称android上的swift,而且完美兼容java,配合起来相当爽利.但偏偏在kotlin的配置上,栽了个大跟头. 在android里引入ko

使用Kotlin开发Android应用

1.Kotlin介绍 [Kotlin](https://kotlinlang.org/) Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者.Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进. Java缺失的很多特性在最新的修订版中逐渐覆盖到了,但Android开发者暂时还没能够使用它们.这就使得类似Kotlin这样的语言有了用武之地了:在旧的开发环境中使用现代语言的特性. K