Z
ZHANK
编程在线教程Kotlin 教程委托与属性委托
实用技巧

委托与属性委托

类委托 by、属性委托 lazy/observable/vetoable、自定义委托

委托与属性委托

委托模式在 Kotlin 中是语言级支持——by 关键字一行搞定。

学完本章你将: 掌握类委托 by、属性委托 lazy/observable/vetoable。


类委托

kotlin
interface Printer {
    fun print()
}

class RealPrinter : Printer {
    override fun print() = println("打印中...")
}

// 一行委托——自动转发所有接口方法
class PrinterProxy(p: Printer) : Printer by p

val proxy = PrinterProxy(RealPrinter())
proxy.print()    // 打印中...

lazy 懒加载

kotlin
val heavyData: String by lazy {
    println("计算中...")
    "结果"                    // 只在第一次访问时执行
}

println("创建完成")
println(heavyData)             // 触发计算
println(heavyData)             // 直接返回缓存

observable 可观察

kotlin
var name: String by Delegates.observable("初始值") { prop, old, new ->
    println("$old$new")
}

name = "小明"     // 输出: 初始值 → 小明
name = "小红"     // 输出: 小明 → 小红

vetoable 可否决

kotlin
var age: Int by Delegates.vetoable(0) { prop, old, new ->
    new >= 0     // 返回 false 则不更新
}

age = 25    // ✅
age = -5    // ❌ 不更新——age 还是 25

Map 委托

kotlin
class User(val map: Map<String, Any>) {
    val name: String by map
    val age: Int by map
}

val user = User(mapOf("name" to "小明", "age" to 25))
println(user.name)    // 小明