如果传递null值,如何将非null字符串变量的值设置为空

时间:2019-04-22 21:21:59

标签: kotlin

如何在Kotlin中实现此Java代码的模拟?

class Item {
    private String text = "";

    public String getText() {
        return text;
    }

    public void setText(String str) {
        if(str == null){
            text = "";
        } else {
            text = str;
        }
    }

}

因此,每当我为文本设置空值时,它的值就会替换为空字符串。 我想要完全相同的行为,但是在Kotlin中,因为我正在Kotlin代码中使用Java类,这可能会返回一些null值。每次在设置字段值之前都要检查可空性不是一个好主意,因为它可能会被意外遗忘,并在运行时给出异常。

4 个答案:

答案 0 :(得分:1)

最简单的方法是text.orEmpty()

对于text.orEmpty()

String?将返回“”(如果为null)或原始字符串

最好的替代选择是text ?: ""

答案 1 :(得分:0)

class Item {
    private var text: String = ""

    fun getText() = text

    fun setText(str: String?) {
        text = str ?: ""
    }
}

答案 2 :(得分:0)

问题中的Java代码实现了一个属性,其值不能为null,但其setter允许为null(将其转换为默认值)。 (Java没有对属性的直接支持,因此您必须手动编写字段,getter和setter的代码。)

这实际上没有等同于Kotlin的习惯用法。直接翻译为:

class Item {
    var text: String = ""
        set(value) { field = value ?: "" }
}

这将声明具有默认值的不可为空的属性。 (就像所有Kotlin属性一样,它的字段是私有的;它也有一个getter方法,并且-因为它是var-一个setter方法,这两个都是公共的,因为没有指定其他可见性。)并且它覆盖了如果传递了null,则用setter替换默认值。

如果从Java代码中调用,那么我认为上面的代码将按预期进行处理。 (我还没有测试过。)

但是,由于Kotlin编译器知道该字段不可为空,因此不允许您首先使用null值来调用setter。这是与Java版本不同的地方。

因此,如果仅从其他Kotlin代码中调用它,则将不会使用?: "",因此不需要覆盖setter。最自然的Kotlin翻译是:

class Item {
    var text: String = ""
}

答案 3 :(得分:0)

有时IDE会告诉你这是不必要的,所以我创建了函数并命名为ifNull,然后我传递了值。

    private fun ifNull(value: String?): String {

    return value ?: " "
}

现在,像这样使用它。

TextView.text = ifNull(name)