You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:45:34