使用Kotlin开发Android应用(III):扩展函数和默认值
通过前面两篇文章,我们学习了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例子,实践出真知。
使用Kotlin开发Android应用(III):扩展函数和默认值的更多相关文章
- 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数
本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...
- 用Kotlin开发Android应用(IV):定制视图和Android扩展
原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...
- 用Kotlin开发Android应用(I):介绍
关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...
- 使用Kotlin开发Android应用(I):简单介绍
使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...
- 使用Kotlin开发Android应用(IV):自定义视图和Android扩展
在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotl ...
- 用Kotlin开发Android应用(II):创建新项目
这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...
- 让你的代码量减少3倍!使用kotlin开发Android(一)
让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...
- 使用Kotlin开发Android应用 - 环境搭建 (1)
一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...
- 使用Kotlin开发Android应用(II):创建新工程
在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...
- 使用Kotlin开发Android
查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...
随机推荐
- linux 查看cpu相关信息命令
- unity, 对于Debug.Log输出的log,可以双击定位到代码
unity, 对于Debug.Log输出的log,可以双击定位到代码
- java正则表达式基础知识(转)
1基础 2.1 简单字符类 构造 描述 [abc] a,b或c [^abc] 除a,b或c外的字符 [a-zA-Z] a至z 或 A至Z [a-d[m-p]] a至d 或 m至p [a-z&& ...
- IE6下css常见bug处理
1.双倍边距 如下图所示,一个样式里面既设定了“float:left:”又有“margin-left:100px:”的情况,就呈现了双倍情况.如外边距设置为100px, 而左侧则呈现出200px,解决 ...
- 使用 ObjectDataSource 缓存数据
简介 就计算机科学而言 , 缓存 过程包括成本昂贵的数据或信息的获取 , 以及将备份存储在可快速访问的位置.对于数据驱动的应用程序,大型.复杂的查询通常会消耗大量应用程序执行时间.要提升这类应用程序的 ...
- Netbeans取消CTRL+\才能代码提示的方法
更好的方法: ------------------------------------------------------------ 边打字边按CTRL+\进行代码提示的方法我TM也是醉了 简而言之 ...
- PCB焊接工艺
1. 有铅焊接工艺 240~260℃. 2. BGA焊盘直径为球径80%.
- K - Large Division 判断a是否是b的倍数。 a (-10^200 ≤ a ≤ 10^200) and b (|b| > 0, b fits into a 32 bit signed integer). 思路:取余;
/** 题目:K - Large Division 链接:https://vjudge.net/contest/154246#problem/K 题意:判断a是否是b的倍数. a (-10^200 ≤ ...
- Linux中解压缩命令gzip和unzip的一点说明
inux中解压缩命令gzip和unzip的一点说明 转载 2014年10月29日 20:37:35 20741 Linux 常用的压缩命令有 gzip 和 zip,两种压缩包的结尾不同:zip 压 ...
- Windows中搭建ftp服务器
使用工具Quick Easy FTP Server Windows中搭建FTP服务器有什么用呢? 确实没有用,直到有一次,我在VM中安装了Linux虚拟机,但是文件怎么也上传不到这个虚拟机中. 然后用 ...