导读大纲
- 1.1.1 扩展属性的创建和使用
 
1.1.1 扩展属性的创建和使用
-  
之前, 我们已经了解声明 Kotlin 属性的语法
- Kotlin中的顶级属性–传送门
 - 就像扩展函数一样,我们也可以指定扩展属性
 - 就像之前所说,属性和函数的区别在于前者是特征,后者是行为 
- 相比扩展函数,扩展属性无非就是使用属性访问语法来访问扩展功能
 
 
 -  
在上一节中,我们定义扩展函数 lastChar()
- 扩展函数 lastChar()–传送门
 - <1> 让我们把它转换成一个属性,这样就可以调用 “myText”.lastChar
 - 与函数一样,扩展属性看起来就像添加接收器类型的普通属性 
- 必须始终定义getter,因为没有后备字段 
- 扩展属性就是
通过自定义 getter 访问器来实现对已有类的功能扩展 
 - 扩展属性就是
 - 由于这里的实现比较简单, 所以
使用表达式体的形式定义get() 
 - 必须始终定义getter,因为没有后备字段 
 
 
val String.lastChar: Char           // <1>get() = get(length - 1)
fun main() {println("Kotlin".lastChar)      // <1>
}
 
- 如果在 StringBuilder 上定义 lastChar 属性 
- <1> 可以将其作为 var, 因为 StringBuilder 的内容可以被修改
 - <2> 访问扩展属性与访问成员属性完全相同
 - <3> 这里直接通过赋值来调用扩展属性的setter访问器 
- setter访问器内部可以
调用接收器对象的任意方法,比如这里的setCharAt 
 - setter访问器内部可以
 
 
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!
}
 
- 请注意,当需要从 Java 访问扩展属性时,必须明确调用其getter和setter 
- <1> 在Java中遵照 Java 的属性调用惯例来调用xxx.getLastChar(sb) 
- 从这里看出扩展属性的本质还是静态性的
 - 底层其实还是
挂载在 StringFunctions 类下静态方法- StringFunctions是通过注解"JvmName"来指定的, 这里不再赘述
 
 
 
 - <1> 在Java中遵照 Java 的属性调用惯例来调用xxx.getLastChar(sb) 
 
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);}
}