簡體   English   中英

Kotlin懶惰的默認屬性

[英]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.getValueimport kotlin.properties.setValue

如果Kotlin為此提供內置和優化(如mutableLazy或其他東西),那將是很好的。 因此,我創造了KT-10451

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM