委托与属性委托
类委托 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) // 小明