Kotlin中的扩展属性

前言

Kotlin是一种在Java虚拟机上运行的静态类型编程语言,被称之为Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成为Android官方开发语言

什么是扩展属性

扩展属性与扩展函数类似,但是需要注意的是我们在使用扩展函数的时候会发现,而是生成了对应的调用静态函数,并没有真正的扩展了类中的函数

fun TextView.setTextOptional(text: String?) {
    this.text = if (text.isNullOrEmpty()) {
        "NaN"
    } else {
        text
    }
}

编译生成

public static final void setTextOptional(@NotNull TextView $this$setTextOptional, @Nullable String text) {
    $this$setTextOptional.setText((CharSequence)(var6 ? "NaN" : text));
}

扩展只是语法层面的一个表现,并没有实际的成员插入到类中去,所以对扩展属性来说,幕后字段是无效的,也就是说扩展属性不能有初始化容器,只能通过set/get去进行使用

val Response.hasCode:Boolean = false //报错,不能有初始化容器
val Response.hasCode:Boolean //正确
    get() = code.isEmpty()

在一个类中定义另一个类的扩展
通常我们会在顶级声明处声明扩展,也可以将扩展声明在另一个类中

如果声明在文件顶层则可以访问同一文件中其他private的顶层声明,因为相同文件中的顶层声明编译时会生成在同一个类文件中

fun TextView.setTextOptional(text: String?) {
    this.text = if (text.isNullOrEmpty()) {
        "NaN"
    } else {
        text
    }
}
val Response.hasCode:Boolean
        get() = code.isEmpty()

顶层声明会被编译为以下代码,事实上他们是在同一个类文件中,是可以互相访问的

public final class TestKt {
   public static final void setTextOptional(@NotNull TextView $this$setTextOptional, @Nullable String text) {
      $this$setTextOptional.setText((CharSequence)(text? "NaN" : text));
   }

   public static final boolean getHasCode(@NotNull Response $this$hasCode) {
      return (CharSequence)$this$hasCode.getCode().length() == 0;
   }
}

如果声明在其他类中

class LoginResponseHandler{
    val Response.isPass: Boolean
        get() = code == "0" && data.equals("success", true)
}
public final class LoginResponseHandler {
   public final boolean isPass(@NotNull Response $this$isPass) {
      return Intrinsics.areEqual($this$isPass.getCode(), "0") && StringsKt.equals($this$isPass.getData(), "success", true);
   }
}

如果扩展函数内部调用与当前类中的函数冲突,则需要显示的指定this对象

class LoginResponseHandler{
    val Response.isPass: Boolean
        get() = code == "0" && data.equals("success", true)

    fun Response.responseToString(){
        toString() //Response.toString()
        [email protected]() //LoginResponseHandler.toString()
    }
}

欢迎关注Mike的

Android知识整理

你可能感兴趣的:(Kotlin中的扩展属性)