如何在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值。每次在设置字段值之前都要检查可空性不是一个好主意,因为它可能会被意外遗忘,并在运行时给出异常。
答案 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)