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

如何在Kotlin中强制执行空的非空字符串?,kotlin,Kotlin,我经常想保留一个不能为null或空白的字符串,空白不够好。编译器很好地处理String?以防止null,我们可以使用aNullableString.isNullOrBlank()检查它是null还是空白。但是,这要求空白支票在使用的任何地方都要处理,如果空白,则处理错误,如果您错过了一个点,可能会导致意外错误。 是否有一种更简单的方法来定义字符串的类型或扩展名,以强制该字符串不能为空?如果您在多个位置需要此行为,您可以创建一个委托来处理它,您可以在私有属性的setter或setValue函数中执

我经常想保留一个不能为null或空白的字符串,空白不够好。编译器很好地处理
String?
以防止null,我们可以使用
aNullableString.isNullOrBlank()
检查它是null还是空白。但是,这要求空白支票在使用的任何地方都要处理,如果空白,则处理错误,如果您错过了一个点,可能会导致意外错误。
是否有一种更简单的方法来定义字符串的类型或扩展名,以强制该字符串不能为空?

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

您可以创建一个新的“NoneEmptyString”类型来包装字符串,并通过检查提供给其构造函数的“input”字符串来确保它从不为空。您也只能公开包装字符串上不会导致其变为空的操作。或者,您可以添加此类操作,但需要进行检查以确保它们不会实际导致空字符串。此外,中的
observatable
vetoable
可以稍微简化此实现:您不需要实现
get/setValue(…)
运算符,但只传递检查分配的代码。Ah-String是最终的,所以不能通过子类来完成。使用代理看起来不错。很可能会在构造函数和setter中抛出异常,或者使用
vetoable
简单地拒绝输入,这取决于最适合我使用的方法。谢谢。
var nonEmpty by NonEmptyString("something")
nonEmpty = ""
println(nonEmpty) // "something"