今天来讲一讲Kotlin中另外一神器,extension,虽然其实没有这个关键字,但却是一个离不开的利器。之前的文章也已经有介绍了的《我与 Kotlin 的爱恨情仇之浅谈 Extensions》。
什么是 extension ?
学一样东西,都是从字面来理解含义,那么extension顾名思义即扩展的意思,他与extend完全不同,extend是继承派生出新的类以达到新功能。
extension 是在不改动原来的类的基础上进行扩展。
如何使用?
extension 用法可以参考官方文档 https://kotlinlang.org/docs/reference/extensions.html
这里只举个列子:
//给 MutableList<Int> 扩展一个swap方法
fun MutableList<Int>.swap(index1: Int, index2: Int) {
val tmp = this[index1] // 'this' corresponds to the list
this[index1] = this[index2]
this[index2] = tmp
}
//使用swap方法
val l = mutableListOf(1, 2, 3)
l.swap(0, 2) // 'this' inside 'swap()' will hold the value of 'l'
Kotlin 如何实现 extension ?
�我们可以看一下编译出来的jar:
public static final void swap(List<Integer> $receiver, int index1, int index2)
{
Intrinsics.checkParameterIsNotNull($receiver, "$receiver");int tmp = ((Number)$receiver.get(index1)).intValue();
$receiver.set(index1, $receiver.get(index2));
$receiver.set(index2, Integer.valueOf(tmp));
}
ok,可以看出来,Kotlin 的extension 其实最终是生成了静态方法。这也接受了为什么 extension 为什么不能给类追加变量,而只能以追加方法的形式。
我们平时工作中又能做什么呢?
比如我们�可以对activity/view进行扩展,实现findViewById,可以对imageView进行扩展,实现图片加载,那么我们在加载的�图片的时候就很方便了的,比如imageview.load(url)即可,而不是像之前那样要写类似这样的ImageLoader.shared().load(imageview,url)繁琐的代码了的。