我經常想持有不能爲空的字符串或空白 - 空白不夠好。編譯器很好地處理了String?
以防止null,我們可以使用aNullableString.isNullOrBlank()
來檢查它是否爲空或空白。但是,這要求在使用空白檢查的任何地方處理空白檢查,然後在空白處處理錯誤,如果錯過了某個位置,可能會導致意外錯誤。如何在Kotlin中執行一個空的非空字符串?
有沒有更簡單的方法來定義String
的類型或擴展名,這將強制字符串不能爲空?
我經常想持有不能爲空的字符串或空白 - 空白不夠好。編譯器很好地處理了String?
以防止null,我們可以使用aNullableString.isNullOrBlank()
來檢查它是否爲空或空白。但是,這要求在使用空白檢查的任何地方處理空白檢查,然後在空白處處理錯誤,如果錯過了某個位置,可能會導致意外錯誤。如何在Kotlin中執行一個空的非空字符串?
有沒有更簡單的方法來定義String
的類型或擴展名,這將強制字符串不能爲空?
如果您需要在多個地方這種行爲,你可以創建一個委託來處理它,在那裏你可以做私人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.properties.Delegates']中有'observable'和'vetoable'(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/index.html)這可以稍微簡化此實現:您不需要實現'get/setValue(...)'運算符,而只需傳遞用於檢查分配的代碼。 – hotkey
啊 - 字符串是最終的,所以你不能通過子類來做到這一點。使用代表看起來不錯。可能會在構造函數和setter中拋出異常,或者使用'vetoable'來簡單地拒絕輸入,具體取決於對我的用法最適合的輸入。謝謝。 –
你可以做一個新的「NonEmptyString」類型,它包裝一個字符串,並確保它永遠不會通過檢查提供給它的構造「輸入」字符串空白。您也可以僅在包裝的字符串上公開操作,而不會使其變爲空。可選地,您可以添加這樣的操作,但通過檢查來確保它們實際上不會導致出現空字符串。 – Alexander