2015-12-18 117 views
9

在Kotlin,我如何定義一個var有一個懶惰的默認值?Kotlin懶惰默認屬性

例如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,它只在稍後進行初始化。

回答

9

您可以創建自己的委託方法:

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開始)。我會看看是否可以用較少的代碼完成。

+0

好的,謝謝!這似乎很多代碼這麼簡單的東西。讓我們看看我們是否找不到更好的替代壽,如果沒有,我會接受你的回答。 –

+0

好的!如果你看看懶惰的實現它看起來像這樣... –

+4

也許它應該在stdlib? – voddan

1

你可以store your property in a map基本上創建一個可變的懶惰。你需要一個可變的地圖(如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

+0

像這樣使用hashmap,我可以在初始化程序中使用上下文嗎? –

+0

我不確定我瞭解你的問題。 「使用上下文」是什麼意思? – mfulton26