kotlin - Kotlin 实现具有更新能力的惰性 var 的最佳方法
问题描述
使用延迟初始化、私有设置器和使用昂贵方法更改值的能力来实现变量的最佳方法是什么?
我的意思是这样的:
private const val NO_INIT = "noInit"
class LazyUpdatableVarClass {
private val initValue by lazy { expensive() }
var value = NO_INIT
private set
get() {
if (field == NO_INIT) {
field = initValue
}
return field
}
fun updateValue() {
value += expensive()
}
private fun expensive() = "hello"
}
这是最短和最好的方法吗?我认为自定义委托并不短,因为我需要一个实现。或者也许有图书馆代表?
使用示例:
val example = LazyUpdatableVarClass()
assertEquals("hello", example.value)
example.updateValue()
assertEquals("hellohello", example.value)
解决方案
可变的自定义委托对value
您没有帮助,因为您不能使用委托的私有设置器(或任何自定义设置器/获取器)。
实现此 API 的更简洁的方法是声明value
为val
并使用可变的支持属性( _value
):
class LazyUpdatableVarClass {
private lateinit var _value: String
private fun getValueOrInit(): String {
if (!::_value.isInitialized) _value = expensive()
return _value
}
fun updateValue() {
_value = getValueOrInit() + expensive()
}
val value get() = getValueOrInit()
private fun expensive() = "hello"
}
推荐阅读
- jquery - 如何将动态工具提示添加到 kendo mvc 网格中的列
- apache-spark - gremlin 控制台外的 Janusgraph OLAP 查询
- bash - 带有空格的 Bash 输入字符串
- bash - 根据用户输入选择的 Bash 脚本
- database - 如何查找谁从前端(Infor WM 应用程序)数据库(oracle 11g)中删除了数据
- codeigniter - 在codeigniter中调用null的成员函数
- caching - Mule 4中如何获取缓存统计数据
- php - OpenTok session_id 没有在 aws 服务器中创建,而在我的本地服务器上它工作正常
- c# - 尝试在 Unity C# 中解析 JSON 数组,但它返回 null
- javascript - 如何在vue中禁用基于子组件表单验证的按钮