![](/img/trans.png)
[英]Kotlin lazy property in data class results in NullPointerException
[英]Kotlin lazy default property
在Kotlin中,如何定義具有惰性默認值的var
?
例如, val
將是這樣的:
val toolbarColor by lazy {color(R.color.colorPrimary)}
我想要做的是,有一些屬性的默認值( toolbarColor
),我可以更改其他任何值。 可能嗎?
編輯:這是部分技巧。
var toolbarColor = R.color.colorPrimary
get() = color(field)
set(value){
field = value
}
是否可以通過寫作來緩解這種情況
var toolbarColor = color(R.color.colorPrimary)
set(value){
field = value
}
以某種方式懶惰地計算默認值? 目前它不起作用,因為color()
需要一個僅在以后初始化的Context
。
您可以創建自己的委托方法:
private class ColorDelegate<T>(initializer: () -> T) : ReadWriteProperty<Any?, T> {
private var initializer: (() -> T)? = initializer
private var value: T? = null
override fun getValue(thisRef: Any?, property: KProperty<*>): T {
return value ?: initializer!!()
}
override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
this.value = value
}
}
在一些代表中聲明:
object DelegatesExt {
fun <T> lazyColor(initializer: () -> T): ReadWriteProperty<Any?, T> = ColorDelegate(initializer)
}
並使用如下:
var toolbarColor by DelegatesExt.lazyColor {
// you can have access to your current context here.
// return the default color to be used
resources.getColor(R.color.your_color)
}
...
override fun onCreate(savedInstanceState: Bundle?) {
// some fun code
// toolbarColor at this point will be R.color.your_color
// but you can set it a new value
toolbarColor = resources.getColor(R.color.new_color)
// now toolbarColor has the new value that you provide.
}
我認為這可能是一種更清潔的方式,但我還不知道(幾天前從kotlin開始)。 我將看看是否可以用更少的代碼完成。
您可以將您的屬性存儲在地圖中,以基本上創建一個可變的懶惰。 您需要一個可變映射(如HashMap<K, V>
),並使用默認函數委派給:
var toolbarColor by hashMapOf<String, Any?>()
.withDefault { toolbarColor = R.color.colorPrimary; toolbarColor }
您還需要導入一些擴展函數: import kotlin.properties.getValue
並import kotlin.properties.setValue
。
如果Kotlin為此提供內置和優化(如mutableLazy
或其他東西),那將是很好的。 因此,我創造了KT-10451 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.