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

标签 kotlin

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

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

最佳答案

如果您在多个地方需要此行为,您可以创建一个委托(delegate)来处理它,您可以在私有(private)属性的 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
    }
}

它的用法如下:

var nonEmpty by NonEmptyString("something")
nonEmpty = ""
println(nonEmpty) // "something"

关于kotlin - 如何在 Kotlin 中强制执行空的非空字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45285702/

相关文章:

java - Kotlin:属性 setter 的文档

java.lang.IllegalStateException : Failed to add the track to the muxer

android - 单击任何按钮时应用程序都会停止工作,错误表示找不到方法

Kotlin "Any type that implements an interface"

java - 如何使用 gradle 任务运行 Shadow jar?

android - 构造函数在 kotlin 派生类中采用 Parcelable 构造函数

android - 清除共享 View 模型

Kotlin:为什么编译器需要 `const` 修饰符?

generics - 针对F <out X>的特定情况F <Nothing>缺少HKT的解决方法

android - 未初始化的属性访问异常 : lateinit property pref has not been initialized