📅  最后修改于: 2023-12-03 14:43:41.435000             🧑  作者: Mango
在 Kotlin 中,委托属性是一种声明了 getter 和 setter 方法,但并不持有属性值的特殊属性。
var <propertyName>: <PropertyType> by <delegate>()
其中,propertyName
表示属性的名称;PropertyType
表示属性的类型;delegate
表示属性的委托对象。
委托对象必须实现 ReadWriteProperty
或 ReadOnlyProperty
接口。
interface ReadWriteProperty<in R, T> {
operator fun getValue(thisRef: R, property: KProperty<*>): T
operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}
其中,getValue()
方法表示获取属性值的方法,setValue()
方法表示设置属性值的方法。
interface ReadOnlyProperty<in R, out T> {
operator fun getValue(thisRef: R, property: KProperty<*>): T
}
其中,只有 getValue()
方法,表示获取属性值的方法。
class Person {
val name: String by lazy {
println("init name")
"Tom"
}
}
fun main() {
val person = Person()
println(person.name)
println(person.name)
}
输出结果:
init name
Tom
Tom
在这个例子中,name
属性通过 lazy
委托实现惰性初始化,即在首次使用属性时才进行初始化。
class Person {
var age: Int by Delegates.observable(0) { _, oldValue, newValue ->
println("Changed from $oldValue to $newValue")
}
}
fun main() {
val person = Person()
person.age = 20
person.age = 30
}
输出结果:
Changed from 0 to 20
Changed from 20 to 30
在这个例子中,age
属性通过 Delegates.observable()
委托实现属性修改的监听,即每次修改属性值时都会触发监听函数。
Kotlin 中的委托属性是一种很实用的特性,可以简化代码,提高代码的可读性和可维护性。进行适当的使用可以减少代码的重复性,提高代码的灵活性。