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
相关产品推荐
相关产品推荐

