用Kotlin开发Android应用(III):扩展函数和默认值
这是关于Kotlin的第三篇。
原文标题:Kotlin for Android (III): Extension functions and default values
原文链接:http://antonioleiva.com/kotlin-android-extension-functions/
原文作者:Antonio Leiva(http://antonioleiva.com/about/)
原文发布:2015-04-06

在你了解Kotlin的基本知识和怎样配置你的项目后,现在我们可以聊聊Kotlin能够为我们做到那些令人关注的事情,而这些Java做不到。记住,如果你对Koklin语言有什么疑问,你可以查阅官方文档。官方文档组织得非常好,并且容易理解。这样在文章中,我将不涵盖基本语言的内容。
扩展函数
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!!")
}
声明扩展函数只需简单地在函数名前加上类名就可以了。在调用处,该函数被导入到类中。
这能够帮助我们简化代码、让封闭类超出其限制。但是,我们必须小心,不能过度使用它们。最终,这些函数通常将替代util类。Util方法是静态且不能被模拟(mock),所以过度使用通常表示我太懒,不愿创建委托类。
这是另一个有趣的例子,我来解释另一个有趣的概念:具体化类型(reified type)。
inline public fun <reified T : Activity> Activity.navigate(id: String) {
val intent = Intent(this, javaClass<T>())
intent.putExtra("id", id)
startActivity(intent)
}
内联函数能用具体化类型,这意味着我们可以用函数内部的类型恢复类,而不是以自变量传递类类型。
内联函数与普通函数有点不同。在编译期间,内联函数会进行代码替换,而不是实际调用函数。这可以使一些问题得以简化。例如,如果有一个自变量是函数,普通函数将在其内部创建一个包含那函数的对象。而内联函数则在调用它的地方用其代码来替换,所以为此不要求内部对象。
navigate<DetailActivity>("2")
用具体化类型,我们能够在函数内部创建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)
可选参数也可以用于默认的构造函数,这样你就能在一条声明中获得多种重载。自定义视图是一个特殊的例子,因为在Java中,它们需要多个构造函数才能正常工作。这将在下篇文章中说明。
总结
用这两个概念,我们可以节省许多代码,甚至可以实现在Java中不可能实现的事。Kotlin极具表达能力且简洁。下篇文章将说明Kotlin Android扩展,可以让我们在Activity中自动地注入视图,以及在Kotlin中怎样产生自定义视图。
记住去查看例子的代码,看看它的实际应用。
前一篇:http://www.cnblogs.com/figozhg/p/4983919.html
用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非常长时间,我差点儿是在学习的同一时候写 ...
随机推荐
- Building third-party products of OpenCascade
Building third-party products of OpenCascade eryar@163.com Available distributives of third-party pr ...
- WPF 子窗体关闭时显示父窗体
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
- Cnblogs支持Latex及测试
为了方便后续机器学习文章的书写,因此在cnblogs中设置了支持Latex. 设置: 在"后台管理"中"页首Html代码"中加入如下代码: <script ...
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- ASP.NET Core的配置(4):多样性的配置来源[下篇]
我们在上篇和中篇对配置模型中默认提供的各种ConfigurationProvider进行了深入详尽的介绍,如果它们依然不能满足项目中的配置需求,我们可以还可以通过自定义ConfigurationPro ...
- (第九天)DOM事件
addEventListener 使用addEventListner()方法可以为事件目标注册事件处理程序.addEventListner()接受三个参数.第一个是要注册处理程序的事件类型,这个事件类 ...
- BFC之清除浮动篇&clear
我们在日常代码生活中,或多或少会利用浮动来布局,例如导航布局,如下图所示: 但是,我们在实现的时候,经常会遇到父元素“塌陷”以及清除浮动问题.例如 <!DOCTYPE html> < ...
- c# 枚举
命名空间: System程序集: mscorlib(mscorlib.dll 中) 定义一个枚举类型 public enum Week { [Description("星期一" ...
- 如何设置SharePoint 2013 的根网站集下的“更改此术语的目标页面”
起因: 首先看问题截图Figure 1,在术语驱动的页面中设置更改此术语的目标页面,会被警告“该URL 不指向某个页面”,原因是我所找到的这个目标页面是一个非aspx结尾的URL链接. Figure ...
- Oracle数据块损坏篇之10231内部事件
实验:某个分区数据块损坏,不完全恢复此分区表数据 背景:数据库没有有效备份,某个分区中有数据块损坏. 要求:最大限度恢复此分区数据. 环境:RHEL 6.4 + Oracle 11.2.0.4 1. ...