是否有更清晰,更惯用的方式来重写此“检查,分配和返回”功能?
fun getX(): Y {
if (X == null) {
X = ...
}
return X!!
}
编辑:我知道猫王运算符,但问题是尽管我可以用语法糖节省几行
fun getX(): Y {
X = X ?: ...
return X!!
}
我没有更改代码的语义。无论如何,我都必须强制转换(!!
)。所以是一样的,只是短了三行。
编辑:X
是某些对象的属性,我需要对其进行更新。
答案 0 :(得分:2)
我认为您正在寻找by lazy
,即,在首次调用该属性时已初始化的属性。参见Delegated Properties和lazy initialization tutorial
val x :String by lazy {
"a"
}
或您的情况:
val z : Y by lazy {
y!!
}
您可能还想看看lateinit-properties:
lateinit val y : Y
答案 1 :(得分:2)
您可以使用also
函数将分配移动到Elvis运算符的右侧:
fun getX() = x ?: valueIfXisNull.also { x = it }
答案 2 :(得分:1)
您可以使用Elvis Operator:?:
如果?:左侧的表达式不为null,则elvis运算符将其返回,否则它将返回右侧的表达式。
您可以使用elvis运算符更新变量,然后返回结果。
fun getX(): Y {
x = x ?: valueIfNull // If x is null, x becomes 'valueIfNull'.
return x!! // x cannot be null, return it.
}