自学内容网 自学内容网

【解密 Kotlin 扩展函数】扩展属性与扩展函数类似(十九)

1.1.1 扩展属性的创建和使用

  1. 之前, 我们已经了解声明 Kotlin 属性的语法

    • Kotlin中的顶级属性–传送门
    • 就像扩展函数一样,我们也可以指定扩展属性
    • 就像之前所说,属性和函数的区别在于前者是特征,后者是行为
      1. 相比扩展函数,扩展属性无非就是使用属性访问语法来访问扩展功能
  2. 在上一节中,我们定义扩展函数 lastChar()

    • 扩展函数 lastChar()–传送门
    • <1> 让我们把它转换成一个属性,这样就可以调用 “myText”.lastChar
    • 与函数一样,扩展属性看起来就像添加接收器类型的普通属性
      1. 必须始终定义getter,因为没有后备字段
        • 扩展属性就是通过自定义 getter 访问器来实现对已有类的功能扩展
      2. 由于这里的实现比较简单, 所以使用表达式体的形式定义get()
val String.lastChar: Char           // <1>
    get() = get(length - 1)
fun main() {
    println("Kotlin".lastChar)      // <1>
}
  1. 如果在 StringBuilder 上定义 lastChar 属性
    • <1> 可以将其作为 var, 因为 StringBuilder 的内容可以被修改
    • <2> 访问扩展属性与访问成员属性完全相同
    • <3> 这里直接通过赋值来调用扩展属性的setter访问器
      1. setter访问器内部可以调用接收器对象的任意方法,比如这里的setCharAt
var StringBuilder.lastChar: Char                // <1>
    get() = this.get(length - 1)
    set(value) {                                // <1>
        this.setCharAt(length - 1, value)       // <3>
    }
fun main() {
    println("Kotlin".lastChar)
    val sb = StringBuilder("Kotlin?")           // <2>
    println(sb.lastChar)                        // <2>
    // ?
    sb.lastChar = '!'                           // <3>
    println(sb)
    // Kotlin!
}
  1. 请注意,当需要从 Java 访问扩展属性时,必须明确调用其getter和setter
    • <1> 在Java中遵照 Java 的属性调用惯例来调用xxx.getLastChar(sb)
      1. 从这里看出扩展属性的本质还是静态性
      2. 底层其实还是挂载在 StringFunctions 类下静态方法
        • StringFunctions是通过注解"JvmName"来指定的, 这里不再赘述
import strings.StringFunctions;
public class Example {
    public static void main(String[] args){
        StringBuilder sb = new StringBuilder("Kotlin?");
        System.out.println(StringFunctions.getLastChar(sb));  // <1>
        StringFunctions.setLastChar(sb,'!');                  // <1>
        System.out.println(sb);
    }
}

原文地址:https://blog.csdn.net/qq_36154755/article/details/142578591

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!