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

Kotlin中如何在调用一组函数时自动更新变量值?

问题

我有如下Kotlin代码:

class Invoice(val items: Items) {
    private var modified: LocalDateTime = LocalDateTime.now()

    // 示例函数(内容不重要)
    // 我希望每次调用这些函数中的任意一个时,将modified设为LocalDateTime.now()
    val put: (String, Item) -> Unit = { key, value -> items.put(key, value) }
    val remove: (String) -> Unit = { key -> items.remove(key) }
    val updatePrice: (String, BigDecimal) -> Unit = { key, price -> items.updatePrice(key, price) }
}

我可以在每个函数中手动添加modified = LocalDateTime.now()来实现,比如:

val put: (String, Item) -> Unit = { key, value ->
    items.put(key, value)
    modified = LocalDateTime.now()
}

但我想知道有没有更简洁的方式,避免重复编写这行代码?

解决方案

方法一:用高阶函数统一封装修改追踪逻辑

定义重载的高阶函数,把更新modified的逻辑抽离出来,所有需要触发修改时间更新的操作都通过这个函数包装:

class Invoice(val items: Items) {
    private var modified: LocalDateTime = LocalDateTime.now()

    // 处理双参数操作的包装函数
    private fun <P1, P2> trackModification(block: (P1, P2) -> Unit): (P1, P2) -> Unit = { p1, p2 ->
        block(p1, p2)
        modified = LocalDateTime.now()
    }

    // 处理单参数操作的包装函数
    private fun <P> trackModification(block: (P) -> Unit): (P) -> Unit = { p ->
        block(p)
        modified = LocalDateTime.now()
    }

    // 直接使用包装后的逻辑定义操作
    val put: (String, Item) -> Unit = trackModification { key, value -> items.put(key, value) }
    val remove: (String) -> Unit = trackModification { key -> items.remove(key) }
    val updatePrice: (String, BigDecimal) -> Unit = trackModification { key, price -> items.updatePrice(key, price) }
}

这种方式把重复的更新逻辑完全抽离,每个业务操作只需要关注自身核心逻辑,后续新增操作也只需要复用包装函数即可。

方法二:转为成员函数+统一修改标记方法

如果不需要把操作暴露为lambda属性,更符合Kotlin常规写法的方式是定义成员函数,配合一个统一的标记修改方法:

class Invoice(val items: Items) {
    private var modified: LocalDateTime = LocalDateTime.now()

    private fun markModified() {
        modified = LocalDateTime.now()
    }

    fun put(key: String, value: Item) {
        items.put(key, value)
        markModified()
    }

    fun remove(key: String) {
        items.remove(key)
        markModified()
    }

    fun updatePrice(key: String, price: BigDecimal) {
        items.updatePrice(key, price)
        markModified()
    }
}

这种写法可读性更强,也避免了重复代码,同时更贴合面向对象的类设计思路。

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:14