Der kürzeste Weg von Ich denke, kann in der Tat wird mit dem elvis Betreiber:
value = value ?: newValue
Wenn Sie dies oft tun, eine Alternative ist es, ein delegated property, verwenden, die nur den Wert speichert, wenn seine 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
}
}
Sie jetzt eine Eigenschaft erstellen können, die dies so wie verwendet:
var value by Once<String>()
fun main(args: Array<String>) {
println(value) // 'null'
value = "1"
println(value) // '1'
value = "2"
println(value) // '1'
}
Beachten Sie, dass dies nicht threadsicher ist und keine Zurücksetzung auf null
erlaubt. Außerdem wird der Ausdruck new
ausgewertet, während dies bei der einfachen Version von elvis nicht der Fall ist.
Suchen Sie etwas wie [faul] (https://kotlinlang.org/docs/reference/delegated-properties.html#lazy)? – nhaarman
hmm, nicht wirklich ... Ich meine, in meinem Fall, ich möchte eine 'uid' auf einem' prePersist' JPA Hook zuweisen und ich dachte, dass vielleicht Kotlin einen eleganten Weg hatte stattdessen zu überprüfen, ob 'uid' null ist und zuweisen –
Ich denke, "value = value?: NewValue" ist in der Tat der kürzeste Weg. – nhaarman