Kotlin中如何用属性委托简化嵌套属性的扩展属性声明?
用属性委托简化Kotlin扩展属性的声明
当然可以用属性委托来简化这类嵌套属性的扩展声明,核心是实现一个通用的ReadWriteProperty委托类,把嵌套属性的读写逻辑封装进去,避免重复编写get/set代码。
实现通用嵌套属性委托
首先定义一个适配读写操作的委托类:
import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty class NestedPropDelegate<T, V>( private val valueGetter: T.() -> V, private val valueSetter: T.(V) -> Unit ) : ReadWriteProperty<T, V> { override fun getValue(thisRef: T, property: KProperty<*>): V { return thisRef.valueGetter() } override fun setValue(thisRef: T, property: KProperty<*>, value: V) { thisRef.valueSetter(value) } }
简化扩展属性声明
有了这个委托类,你就可以用by语法来声明Player.x扩展属性:
var Player.x by NestedPropDelegate( getter = { location.x }, setter = { location.x = it } )
如果觉得每次写NestedPropDelegate有点繁琐,还可以封装一个工厂函数进一步简化:
fun <T, V> nestedProp( getter: T.() -> V, setter: T.(V) -> Unit ): ReadWriteProperty<T, V> = NestedPropDelegate(getter, setter) // 现在写法更简洁 var Player.x by nestedProp({ location.x }, { location.x = it })
验证效果
测试一下委托后的属性行为,和原扩展属性完全一致:
fun main() { val player = Player(Location(5, 15)) println(player.x) // 输出5 player.x = 25 println(player.location.x) // 输出25 }
这个方案的优势在于,如果你需要扩展更多嵌套属性(比如Player.y),可以直接复用同一个委托类,不用重复编写几乎一样的get/set逻辑。
内容的提问来源于stack exchange,提问作者Pylvain
相关产品推荐
相关产品推荐

