📜  Kotlin 中的委托属性(1)

📅  最后修改于: 2023-12-03 14:43:41.435000             🧑  作者: Mango

Kotlin 中的委托属性

在 Kotlin 中,委托属性是一种声明了 getter 和 setter 方法,但并不持有属性值的特殊属性。

委托属性的定义
var <propertyName>: <PropertyType> by <delegate>()

其中,propertyName 表示属性的名称;PropertyType 表示属性的类型;delegate 表示属性的委托对象。

委托对象的定义

委托对象必须实现 ReadWritePropertyReadOnlyProperty 接口。

ReadWriteProperty 接口
interface ReadWriteProperty<in R, T> {
    operator fun getValue(thisRef: R, property: KProperty<*>): T
    operator fun setValue(thisRef: R, property: KProperty<*>, value: T)
}

其中,getValue() 方法表示获取属性值的方法,setValue() 方法表示设置属性值的方法。

ReadOnlyProperty 接口
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 中的委托属性是一种很实用的特性,可以简化代码,提高代码的可读性和可维护性。进行适当的使用可以减少代码的重复性,提高代码的灵活性。