扩展函数

定义

Kotlin 能够扩展一个类的新功能而无需继承该类或者使用像装饰者这样的设计模式。 这通过叫做 扩展 的特殊声明完成。 例如,你可以为一个你不能修改的、来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用。 这种机制称为 扩展函数 。此外,也有 扩展属性 , 允许你为一个已经存在的类添加新的属性。

你只需要在你添加的函数名字之前放置你想要扩展的类或者接口的类型。这个类名叫着接收器类型(receiver type),而你调用的扩展函数的值叫做接收器对象(receiver object)。如下图:

扩展函数和属性 - 图1
receiver

接收器类型是扩展定义的类型,而接收器对象是这个类型的实例。调用方式跟普通的函数调用方式一致:

  1. println("Kotlin".lastChar())

在这个例子中,String是接收器类型,"Kotlin"接收器对象,在这个扩展函数中,你可以直接访问你扩展的类型的函数和属性,就像定义在这个类中的方法一样,但是扩展函数并不允许你打破封装。跟定义在类中方法不同,它不能访问那些私有的、受保护的方法和属性。

  1. fun String.spaceToCamelCase() { …… }
  2. "Convert this to camelcase".spaceToCamelCase()

扩展属性

定义扩展属性,必须定义getter函数,它没有默认getter的实现。初始化也不可以:因为没有地方存储初始值

  1. val String.lastChar: Char
  2. get() = get(length - 1)

声明一个可变的扩展属性

  1. var StringBuilder.lastChar: Char
  2. get() = get(length - 1) //属性getter
  3. set(value: Char) {
  4. this.setCharAt(length - 1, value) //属性setter
  5. }

你可以像访问使用成员属性一样访问它:

  1. >>> println("Kotlin".lastChar)
  2. n
  3. >>> val sb = StringBuilder("Kotlin?")
  4. >>> sb.lastChar = '!'
  5. >>> println(sb)
  6. Kotlin!

注意,当你需要从Java里面访问扩展属性的时候,你应该显式地调用它的getter函数:

  1. StringUtilKt.getLastChar(new StringBuilder("Java"))

参考

  1. 扩展 - Kotlin 语言中文站
  2. Kotlin扩展函数和扩展属性笔记 - 简书
  3. Kotlin 顶层函数、扩展函数详解 - 简书