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



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

class Item {
private String text = "";
public String getText() {
return text;
}
public void setText(String str) {
if(str == null){
text = "";
} else {
text = str;
}
}
}

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

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

如果为 null,则String?text.orEmpty()将返回 ",或者返回原始字符串

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

class Item {
private var text: String = ""
fun getText() = text
fun setText(str: String?) {
text = str ?: ""
}
}

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

这实际上没有一个惯用的 Kotlin 等价物。 直接翻译为:

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

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

如果从 Java 代码调用,那么我认为上述内容将按预期处理它。 (我还没有测试过。

但是因为 Kotlin 编译器知道该字段不可为空,所以它首先不允许你用 null 值调用 setter;这就是它与 Java 版本的不同之处。

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

class Item {
var text: String = ""
}

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

private fun ifNull(value: String?): String {
return value ?: " "
}

现在,像这样使用它。

TextView.text = ifNull(name)

最新更新