一、什么是扩展函数?
扩展函数数是指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权限。这是一个在缺少有用函数的类上扩展的方法,Kotlin能够为我们做到那些令人关注的事情,而这些Java做不到。
在Java中,通常会实现很多带有static方法的工具类,而Kotlin中扩展函数的一个优势是我们不需要在调用方法的时候把整个对象当作参数传入,它表现得就像是属于这个类的一样,而且我们可以使用this关键字和调用所有public方法。
二、扩展函数的使用
(1)函数的扩展
简单来说,Kotlin扩展函数允许我们在不改变已有类的情况下,为类添加新的函数。例如,我们能够为Activity中添加新的方法,让我们以更简单术语显示toast,并且这个函数不需要传入任何context,它可以被任何Context或者它的子类调用,比如Activity或者Service:
fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
当然你也可以这样写:
fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){
Toast.makeText(this, message, duration).show()
}
对参数的解释:
- Activity:表示函数的接收者,也就是函数扩展的对象
- . :扩展函数修饰符
- toast:扩展函数的名称
我们可以在任何地方(例如在一个工具类文件中)声明这个函数,然后在我们的Activity中将它作为普通方法来直接使用(这里的两种使用方式后文会做解释):
override fun onCreate(savedInstanceState: Bundle?) {
super<BaseActivity>.onCreate(savedInstanceState)
toast("This is onCreate!!")
toast("Hello world!", Toast.LENGTH_LONG)
}
当然了,Anko已经包括了自己的toast扩展函数,跟上面这个很相似(关于Anko是什么,你可以看我的这篇文章。。。)。Anko提供了一些针对CharSequence和resource的函数,还有两个不同的toast和longToast方法:
toast("Hello world!")
longToast(R.id.hello_world)
有一点值得注意:扩展函数并不是真正地修改了原来的类,它的这些作用效果是以静态导入的方式来实现的。扩展函数可以被声明在任何文件中,因此有个通用的方式是把一系列有关的函数放在一个新建的文件里,就像我们刚才所说的工具类当中。
我觉得还是再举几个几个例子来说明一下吧,因为它们完全显示扩展函数的力量。
● 在 Toast 中的高级用法
我们首先看看这个例子:
fun Context.niceToast(message: String,
tag: String = javaClass<MainActivity>().getSimpleName(),
length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, "[$className] $message", length).show()
}
我们增加了一个默认值是类名的参数,如果这是在Java中的话,那么总数开销会以几何形式增长,而现在我们可以通过以下方式调用:
toast("Hello")
toast("Hello", "MyTag")
toast("Hello", "MyTag", Toast.LENGTH_SHORT)
我们甚至还有其它选择,因为我们可以使用参数名字来调用,也就是说我们可以通过在值前写明参数名来传入我们希望的参数:
toast(message = "Hello", length = Toast.LENGTH_SHORT)
这样我们就使用了第二个参数的默认形式,而使用了第一第三个参数的传入值形式。但是你可能觉得这样的函数调用比较难以理解“[ className] message”,这个是 Kotlin 中的String模版,我们接下来讲解一下它。
String模版:
我们可以在String中直接使用模版表达式,它可以帮助我们很简单地在静态值和变量的基础上编写复杂的String。在上面的例子中,我们使用了”[ className] message”。
这就意味着,在任何时候我们使用一个