如何在 Kotlin 中强制执行空的非空字符串?

Jim*_*ask 5 kotlin

我经常想要保存一个不能为空或空白的字符串- 空格还不够好。编译器可以String?很好地防止 null,我们可以使用它aNullableString.isNullOrBlank()来检查它是否为 null 或空白。但是,这要求在使用空白支票的所有地方都对其进行处理,然后在空白支票时处理错误,如果错过某个位置,可能会导致意外错误。

是否有更简单的方法来定义类型或扩展,以String强制字符串不能为空?

zsm*_*b13 4

如果您在多个地方需要此行为,您可以创建一个委托来处理它,您可以在私有属性的 setter 或函数中进行检查setValue

class NonEmptyString(private var str: String) {
    init {
        if (str.isEmpty()) {
            throw IllegalArgumentException("Invalid initial value")
        }
    }

    operator fun getValue(thisRef: Any?, property: KProperty<*>) = str

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        if (value.isEmpty()) {
            return // or throw or something
        }
        str = value
    }
}
Run Code Online (Sandbox Code Playgroud)

它的用法如下:

var nonEmpty by NonEmptyString("something")
nonEmpty = ""
println(nonEmpty) // "something"
Run Code Online (Sandbox Code Playgroud)

  • 此外,[`kotlin.properties.Delegates`](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/index.html) 中还有 `observable` 和 `vetoable`可以稍微简化此实现:您不需要实现“get/setValue(...)”运算符,而只需传递检查分配的代码。 (3认同)