Kotlin 进阶用法:扩展

1,001 阅读2分钟
原文链接: mp.weixin.qq.com

越来越多的Android开发者开始使用kotlin了,最近项目中也需要用到,于是就对kotlin中一些有趣的用法进行了记录。

扩展

Kotlin的扩展包括了扩展函数和扩展属性。扩展能够向已经存在的类中添加新的函数或属性,也包含第三方库或者SDK中的类。

扩展函数

那我们一般在什么场景下需要用到扩展函数呢,最常见的就是我们平时实现的各种Util工具类。通过扩展函数,我们可以直接在对应的类上进行扩展。举个实际的例子,我们对Context类进行扩展。

fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {    Toast.makeText(this, message, duration).show()}

这样,我们就可以在持有Context的地方直接调用toast了,例如Activity中。

class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {      super.onCreate(savedInstanceState)      setContentView(R.layout.activity_main)      toast("test")    }}

p.s 我们的扩展函数定义在什么地方呢?直接创建一个文件,然后写fun就可以了,注意是文件,不是类。外面不需要再包一层。

扩展函数的实质

其实,扩展函数实质上并没有改变原来的类,它只是创建了一个静态方法。所以,我们在Java中如何调用kotlin的扩展函数呢?以上面的扩展函数为例,在java中这样调用(ExtenalFunctionKt是扩展函数所在的文件名):

ExtenalFunctionKt.toast(context,"test");

扩展属性

与扩展函数类似,kotlin也可以扩展属性。

我们看一个例子,用扩展属性来设置View的padLeft属性:

var View.padLeft: Int  get() {      return paddingLeft  }  set(value) {      setPadding(value, paddingTop, paddingRight, paddingBottom)  }

以上是基于已有的属性进行一些封装,如果我们想添加新的属性呢?因为扩展属性实际上不会向类添加新的成员,所以我们无法直接创建一个新成员,但我们可以通过其它方法来实现这样的效果,例如借助SharePreference,(例子中setSpString,getSpString是对Context建立的扩展函数,用来往SP存取数据):

var Context.member: String  get() {      return getSpString("member")  }  set(value) {      setSpString("member",value)  }

拜拜