Kotlin 如何设置非空字符串变量';如果传递了null值,则s值为空

Kotlin 如何设置非空字符串变量';如果传递了null值,则s值为空,kotlin,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中实现此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类,它可能返回一些空值。每次在设置字段值之前检查可空性不是一个好主意,因为它可能会被意外遗忘,并在运行时出现异常。

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

class Item {
    private var text: String = ""

    fun getText() = text

    fun setText(str: String?) {
        text = str ?: ""
    }
}
这实际上并没有一个地道的Kotlin对等词。直接翻译应该是:

class Item {
    var text: String = ""
        set(value) { field = value ?: "" }
}
这声明了一个具有默认值的不可为null的属性。(与所有Kotlin属性一样,其字段是私有的;它还有一个getter方法和一个setter方法,因为它是
var
,这两个方法都是公共的,因为没有指定其他可见性。)如果传递了
null
,它将覆盖setter以替换默认值

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

但是由于Kotlin编译器知道该字段不可为null,因此它首先不允许您使用null值调用setter;这就是它与Java版本的不同之处

因此,如果仅从其他Kotlin代码调用它,则永远不会使用
?:“
,因此不需要重写setter。最自然的Kotlin翻译是:

class Item {
    var text: String = ""
}
最简单的方法是
text.orEmpty()
text.orEmpty()
对于
字符串?
如果为空,将返回“”或原始字符串


最好的替代选项是
text:“

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

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

    return value ?: " "
}
现在,像这样使用它

TextView.text = ifNull(name)

点击Ctrl-shift-A(或Mac上的Cmd-shift-A),然后键入“将java文件转换为Kotlin”。运行时出现异常有什么问题?如果要彻底测试代码,调试异常要比调试静默转换的数据容易得多。
this.text=str:“
”使用私有setter而不是
getText将getter公开()
。您准确地描述了我的问题。Setter仅从kotlin代码调用,但值取自Java库,可能返回null。因此,我一直在寻找一种优雅的方法来轻松克服这些null值,并在null passe中设置空字符串如果Setter仅从kotlin调用,那么我建议使用一个简单的不可为null的属性y(根据我的上一个示例),并在调用setter时修复null,例如
myItem.text=someValueFromJava?:“
(这很简洁,并使null处理更接近Java。),或者,如果经常发生这种情况,可能会向Item添加单独的方法,例如
fun setTextHandlingNull(值:String?{text=value?:”}
。(这使打电话的人更清楚地知道发生了什么。)