Kotlin笔记 Delegated Properties

可以将属性的get set委托给其他类

class Example {
    var p: String by Delegate()
}

当读取或者写入p时,DelegategetValuesetValue会被调用

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }
 
    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name} in $thisRef.'")
    }
}

委托属性的要求

对于val变量,委托需要提供方法getValue,接收两个参数

  • receiver: property属主类型或者其父类。
  • metadata:KProperty或者其父类
  • return type必须是属性类型或其子类

var变量,委托需要提供setValue方法,

  • receiver:同上
  • metadata:同上
  • new value: property类型或者父类

getValuesetValue都需要用operator修饰

Lazy delegate

lazy属性接收一个lambda表达式,在第一次get的时候执行lambda表达式,存储并返回lambda表示的结果

val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

lazy表达式的执行是同步的,如果想取消同步,在lazy的构造函数里传入LazyThreadSafetyMode.PUBLICATION

Observable delegate

Delegates.observable()接收两个参数,第一个是初始化的值,第二个是变量修改后调用的lambda函数,lambda函数接收三个参数,property, old value, new value。


import kotlin.properties.Delegates

class User {
    var name: String by Delegates.observable("<no name>") {
        prop, old, new ->
        println("$old -> $new")
    }
}

fun main(args: Array<String>) {
    val user = User()
    user.name = "first"
    user.name = "second"
}

如果想拦截变量的修改,使用Delegates.vetoable()。vetoable接收两个参数,第一个是初始值,第二个是变量改变前调用的lambda函数,如果lambda返回false,则变量不会被修改

将变量存储在map中

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

val user = User(mapOf(
    "name" to "John Doe",
    "age"  to 25
))

println(user.name) // Prints "John Doe"
println(user.age)  // Prints 25

如果是可变property可以使用MutableMap

class MutableUser(val map: MutableMap<String, Any?>) {
    var name: String by map
    var age: Int     by map
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前序 委托,对于很多Java开发者来说都会一面蒙蔽,我也不例外。委托,维基百科的解释是:有两个对象参与处理同一个请...
    大棋17阅读 3,980评论 0 5
  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 3,504评论 0 8
  • 一. 委托模式 委托模式 是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对...
    wind_sky阅读 683评论 0 1
  • 多年没有碰到的初中同学今天在路上碰到,两人相互问候着,相互问着近况,聊到兴起,我问起他“当年初中毕业了,就没有你的...
    穆信阅读 184评论 0 0
  • 一个是阆苑仙葩,一个是美玉无瑕 。若说没奇缘,今生偏又遇着他;若说有奇缘,如何心事终虚化? 缘分这事能说的清吗? ...
    又开始想吃柚子了阅读 410评论 0 1

友情链接更多精彩内容