gpt4 book ai didi

kotlin - 带有重置的惰性变量

转载 作者:IT老高 更新时间:2023-10-28 13:44:57 28 4
gpt4 key购买 nike

我想创建一个不为空的特定类型的变量,例如 Foo。

然后我希望对变量的所有访问都返回 Foo,就像一个惰性委托(delegate)一样,但是,我也希望能够重置它。

类似:

var foo : String by Foo(init: {"bar"})

print(foo) // prints "bar"
foo = null // or foo.reset()
print(foo) // prints "bar"

我要解决的问题:我有一个适配器索引,当适配器内容更改时我需要重新创建它。所以在更改时我想清除索引,下次有人尝试访问它时,我想重新创建它。

最佳答案

如果目标是有一个惰性初始化的 var 属性 可以重置到它的初始状态,你可以适应 Kotlin 的 SynchronizedLazyImpl允许 invalidate 功能:

private object UNINITIALIZED_VALUE
class InvalidatableLazyImpl<T>(private val initializer: () -> T, lock: Any? = null) : Lazy<T>, Serializable {
@Volatile private var _value: Any? = UNINITIALIZED_VALUE
private val lock = lock ?: this
fun invalidate(){
_value = UNINITIALIZED_VALUE
}

override val value: T
get() {
val _v1 = _value
if (_v1 !== UNINITIALIZED_VALUE) {
return _v1 as T
}

return synchronized(lock) {
val _v2 = _value
if (_v2 !== UNINITIALIZED_VALUE) {
_v2 as T
}
else {
val typedValue = initializer()
_value = typedValue
typedValue
}
}
}


override fun isInitialized(): Boolean = _value !== UNINITIALIZED_VALUE

override fun toString(): String = if (isInitialized()) value.toString() else "Lazy value not initialized yet."

operator fun setValue(any: Any, property: KProperty<*>, t: T) {
_value = t
}
}

然后可以按如下方式使用:

private val fooDelegate = InvalidatableLazyImpl({"bar"})
var foo:String by fooDelegate

println(foo); // -> "bar"
foo = "updated"
println(foo); // -> "updated"
fooDelegate.invalidate()
println(foo); // -> "bar"

显然可以修改委托(delegate)实现以允许 null 值充当重置,但它可能使代码更难推理,即:

println(obj.foo); //-> prints "bar
obj.foo = null //reset the value, implicitely
println(obj.foo); //-> prints "bar", but hey didn't I just said `null`

关于kotlin - 带有重置的惰性变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294183/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com