这是关于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):扩展函数和默认值的更多相关文章

  1. 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数

    本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...

  2. 用Kotlin开发Android应用(IV):定制视图和Android扩展

    原文标题:Kotlin for Android (IV): Custom Views and Android Extensions 原文链接:http://antonioleiva.com/kotli ...

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

    关于Kotlin,网上已有一些介绍的文章,包括Antonio Leiva的这组blog翻译稿.不过,我还是想跟进它们.翻译它们,以锻炼自己的英文翻译.各位高手发现问题,请及时“拍砖”. 原文题目:Ko ...

  4. 使用Kotlin开发Android应用(I):简单介绍

    使用Kotlin开发Android应用(I):简单介绍 @author ASCE1885的 Github 简书 微博 CSDN 原文链接 Kotlin是一门基于JVM的编程语言.它正成长为Androi ...

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

    在读完扩展函数和默认值这篇文章之后,那么接下来要介绍什么呢?在本系列第一篇文章中我们说过,Kotlin使得Android开发更加简单,本文我们将进一步作介绍. 自定义视图 你应该还记得,在说到Kotl ...

  6. 用Kotlin开发Android应用(II):创建新项目

    这是关于Kotlin的第二篇.各位高手发现问题,请继续“拍砖”. 原文标题:Kotlin for Android(II): Create a new project 原文链接:http://anton ...

  7. 让你的代码量减少3倍!使用kotlin开发Android(一)

    让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客:wing的地方酒馆 写在前面 使用kotlin开发android已经两周多了.得到的好处 ...

  8. 使用Kotlin开发Android应用 - 环境搭建 (1)

    一. 在Android Studio上安装Kotlin插件 按快捷键Command+, -> 在Preferences界面找到Plugins -> 点击Browse repositorie ...

  9. 使用Kotlin开发Android应用(II):创建新工程

    在基本了解什么是Kotlin以及Kotlin可以做什么之后,接下来就到了配置Android Studio并使用Kotlin开发Android apps的时候了.首次配置Android Studio需要 ...

  10. 使用Kotlin开发Android

    查看我的所有开源项目[开源实验室] 欢迎增加我的QQ群:[201055521],本博客client源代码下载[请点击] 摘要 我首先声明我并没有使用Kotlin非常长时间,我差点儿是在学习的同一时候写 ...

随机推荐

  1. 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  2. 创建第二个 local network - 每天5分钟玩转 OpenStack(84)

    GUI 中有两个地方可以创建 network: 1. Project -> Network -> Networks 这是普通用户在自己的 tenant 中创建 network 的地方. 2 ...

  3. Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

    前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此 ...

  4. 使用karma测试平时写的小demo(arguments为例)

    有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...

  5. weight属性你用的真的6嘛?

    相信大家在日常开发中一定使用过weight这个属性,它的作用一个是权重,另一个就是渲染优先级,但是你真的能很6的使用它嘛?如果不是,那么请继续往下看!!! 我们知道,当weight起到不同作用的时候, ...

  6. jQuery的extend方法

    jq中的extend在面试中经常会被问道,今天我总结一个下有关于extend的用法三种进行对比,可能不全,希望大家指点, 用法一: $.extend({})  ,为jQuery类添加方法,可以理解为扩 ...

  7. C# PPT 为形状设置三维效果

    在PPT中,形状是非常重要的元素.3-D形状,立体多元,给人耳目一新的感觉.在幻灯片中添加3-D效果形状,必然会为PPT的整体效果增色不少.为形状设置三维格式时,可设置棱台,轮廓线,表面效果等. 本篇 ...

  8. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

  9. ros::spin() 和 ros::spinOnce() 区别及详解

    版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5925381.html 博主提示:本文基于ROS Kinetic Kame,如有更(g ...

  10. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...