Kotlin懒惰的默认属性

时间:2015-12-18 00:59:44

标签: android kotlin

在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,只会在以后初始化。

2 个答案:

答案 0 :(得分:11)

您可以创建自己的委托方法:

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开始)。我将看看是否可以用更少的代码完成。

答案 1 :(得分: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