如何重写这种“检查,分配和返回”模式?

时间:2019-11-12 13:30:27

标签: kotlin

是否有更清晰,更惯用的方式来重写此“检查,分配和返回”功能?

fun getX(): Y {
    if (X == null) {
        X = ...
    }

    return X!!
}

编辑:我知道猫王运算符,但问题是尽管我可以用语法糖节省几行

fun getX(): Y {
    X = X ?: ...
    return X!!
}

我没有更改代码的语义。无论如何,我都必须强制转换(!!)。所以是一样的,只是短了三行。

编辑X是某些对象的属性,我需要对其进行更新。

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找by lazy,即,在首次调用该属性时已初始化的属性。参见Delegated Propertieslazy 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.
}