仅当变量为空时才赋值

时间:2017-06-01 19:37:49

标签: kotlin

在Ruby上有一个像这样的东西:

@var ||= 'value' 

基本上,这意味着@var仅在尚未分配'value'的情况下才会被分配@var(例如,如果@varnil

我在Kotlin上寻找同样的东西,但到目前为止,最接近的是elvis运营商。有没有这样的东西,我错过了文档?

1 个答案:

答案 0 :(得分:15)

我能想到的最短路径确实是使用elvis运算符:

value = value ?: newValue

如果您经常这样做,另一种方法是使用delegated property,它只存储null的值:

class Once<T> {

    private var value: T? = null

    operator fun getValue(thisRef: Any?, property: KProperty<*>): T? {
        return value
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
        this.value = this.value ?: value
    }
}

您现在可以创建一个使用它的属性:

var value by Once<String>()

fun main(args: Array<String>) {
    println(value) // 'null'
    value = "1"
    println(value) // '1'
    value = "2"
    println(value) // '1'
}

请注意,这不是线程安全的,不允许重新设置为null。此外,这会评估new表达式,而简单的elvis运算符版本可能不会。