在Kotlin中该类外部的函数中处理类中字段的空值

时间:2018-02-07 06:00:06

标签: kotlin kotlin-null-safety

class StuffContainer(var stuff: MutableList<String>?) {
    fun appendSomeStuff(newStuff: List<String>) { // Appends to stuff, initialising it if null
        stuff?.addAll(newStuff) ?: let { stuff = ArrayList<String>(newStuff) }
    }
}

fun main (args: Array<String>) {
    val container = StuffContainer(null)

    val arr : ArrayList<String> = ArrayList()
    arr.add("abc")
    arr.add("bcd")

    // Now I want to put arr in container
    container.appendSomeStuff(arr)
    println(container.stuff) // [abc, bcd]

    // That worked. Now how to implement the logic in StuffContainer.appendSomeStuff here?
    container.stuff = null
    //container.stuff?.addAll(arr) ?: let { container.stuff = ArrayList<String>(arr) }
    // Can't write a let expression here

    if (container.stuff == null) {
        container.stuff = ArrayList<String>(arr)
    } else {
        container.stuff?.addAll(arr)
    }
    println(container.stuff) // [abc, bcd]
}

这是我所拥有的代码的精简版本。在上面的代码中,我写了一个main,以便可以复制和执行它。但在实际使用中,我有一个函数可以得到一个&#34; StuffContainer&#34;对象作为论据。

我无法弄清楚如何在类中定义的函数中正确处理类中字段的空值。 我不能使用let表达式,所以我使用了if-else块。

这是最好的方法吗? 尽管kotlin尝试避免由于某些地方的vars被设置为null而导致的bug,但是这个代码在&#34; container&#34;之后无法正常工作。在if块的空检查之后, 设置为null。还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

TLDR

你想做这样的事情。

 when {
        container.stuff == null -> container.stuff = ArrayList<String>(arr)
        else -> container.stuff?.addAll(arr)
    }

OR

 container.stuff = container.stuff ?: ArrayList(arr)

可能有更好的方法。

解释

你期望使用类似这样的东西

container.stuff?.addAll(arr) ?: let { container.stuff = ArrayList<String>(arr) }
  

我在做什么?

首先,您当前使用let方法的方式似乎有点不对。在特定数据项上调用let函数,其中将计算表达式传递给lambda。

仅当表达式求值为NOT null时才调用该函数。

  

为什么这是错的?

  • let函数不是那样调用的
  

这会有用吗?

container.stuff?.addAll(arr)?.let { container.stuff = ArrayList<String>(arr) }

这也不起作用,因为container.stuff为空,因此不会调用addAll函数,因此它不会进入let块。