在Kotlin中,我如何定义var
具有惰性默认值的?
例如,a 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(initializer: () -> T) : ReadWriteProperty { 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 { funlazyColor(initializer: () -> T): ReadWriteProperty = 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开始).我将看看是否可以用更少的代码完成.