Kotlin属性委托 (1
干嘛
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
属性对应的 get()(与 set())会被委托给它(后面被委托的那个东西)的 getValue() 与 setValue() 方法
警告
Kotlin 不允许在局部作用域定义这种扩展属性委托,也就是说
(拓展属性必须定义在这些地方,它可以拓展 量 的属性)
因为
写 val Context.dataStore 时,Kotlin 编译器在底层其实生成了一个类似 public static getDataStore(Context receiver) 的方法
而局部作用域是不能声明这种静态的东西,因为它归属于类,走出类这个东西就没用了,但是又拓展了这个属性,所以卡了
val Context.dataStore by preferencesDataStore(...) 必须放在 顶层(Top-level),即 class 或者 fun 的外面。
否则会无法识别,会报告缺少getValue之类的
而且写在函数内部会导致定义在函数内部(局部作用域),那么每次函数运行都会尝试创建一个新的 DataStore 实例
无论如何,这听起来就很坏
用处:
1.像上面一样,拓展属性
2.委托属性(其实还是一个意思)
3.懒惰(延迟)属性
val lazyValue: String/*缓存属性*/ by lazy {
println("computed!")/*初始化方法*/
"Hello"
}
fun main() {
println(lazyValue)//输出 computed Hello
println(lazyValue)//输出 Hello
}
可观察属性 Observable properties
看一下这一段就懂了
import kotlin.properties.Delegates
var name: String by Delegates.observable("初始值") { property, oldValue, newValue ->
println("${property.name} 从 '$oldValue' 变成了 '$newValue'")
}
fun main() {
name = "Alice" // 输出: name 从 '初始值' 变成了 'Alice'
name = "Bob" // 输出: name 从 'Alice' 变成了 'Bob'
}

浙公网安备 33010602011771号