用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非常长时间,我差点儿是在学习的同一时候写 ...
随机推荐
- MVC4做网站后台:用户管理 ——用户组
用户管理这块包含用户和用户组两部分. 用户组包括浏览 用户组列表,添加.修改.删除用户组等.按照前面思路系统是依据用户组来判断用户权限的,用户组的最主要目的是划分权限.权限这块以后单独在做. 下面实现 ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- andriod 手机按键检测事件 onKeyDown() 简述
函数原型: public boolean onKeyDown(int keyCode, KeyEvent event); 第一个参数是用户按下键时,当前所接收到的按键代号: 第二个参数是按键事件的对象 ...
- 编译器出现conflicting types for 某某的错误原因总结
直译就是xxxx 发生了一种冲突!比如今天发现的这个错误,实属低级! 本次错误的原因是:函数没有先声明,便写在了主函数后面!应该是先声明,后定义,如果只有定义,则定义必须写在主函数上方.通过查资料,有 ...
- JS详细教程(下)
五.数组 数组是数据的有序列表,每个元素在数组中都有数字位置编号,也就是索引.JS中的数组是弱类型,每一项都可以保存任何类型的数据. 创建数组 ①使用Array构造函数 var arr=new Arr ...
- java多线程--线程池的使用
程序启动一个新线程的成本是很高的,因为涉及到要和操作系统进行交互,而使用线程池可以很好的提高性能,尤其是程序中当需要创建大量生存期很短的线程时,应该优先考虑使用线程池. 线程池的每一个线程执行完毕后, ...
- hibernate笔记--组件映射方法
假设我们需要保存学生student的信息,student中有一个address属性,我们知道像这种信息其值可能会有多个,就像一个人会有两个以上的手机号,这种情况在hibernate中应该这样配置: 新 ...
- JSON导出CSV中文乱码解决方案
前言 以往datagrid导出数据全部在后台搞定,现在就想换中思路去解决,正常情况下使用easyui datagrid ajax获取数据源时都是json格式,那么此时需要导出数据时只要把该数据源扔出来 ...
- 【JVM】JVM系列之类加载机制(四)
一.前言 前面分析了class文件具体含义,接着需要将class文件加载到虚拟机中,这个过程是怎样的呢,下面,我们来仔细分析. 二.什么是类加载机制 把class文件加载到内存,并对数据进行校验.转换 ...
- 自定义iOS 中推送消息 提示框
看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消 ...