2017-07-24 84 views
2

我經常想持有不能爲空的字符串或空白 - 空白不夠好。編譯器很好地處理了String?以防止null,我們可以使用aNullableString.isNullOrBlank()來檢查它是否爲空或空白。但是,這要求在使用空白檢查的任何地方處理空白檢查,然後在空白處處理錯誤,如果錯過了某個位置,可能會導致意外錯誤。如何在Kotlin中執行一個空的非空字符串?

有沒有更簡單的方法來定義String的類型或擴展名,這將強制字符串不能爲空?

+0

你可以做一個新的「NonEmptyString」類型,它包裝一個字符串,並確保它永遠不會通過檢查提供給它的構造「輸入」字符串空白。您也可以僅在包裝的字符串上公開操作,而不會使其變爲空。可選地,您可以添加這樣的操作,但通過檢查來確保它們實際上不會導致出現空字符串。 – Alexander

回答

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 
    } 
} 

這樣做的用法是這樣的:

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

此外,['kotlin.properties.Delegates']中有'observable'和'vetoable'(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/index.html)這可以稍微簡化此實現:您不需要實現'get/setValue(...)'運算符,而只需傳遞用於檢查分配的代碼。 – hotkey

+0

啊 - 字符串是最終的,所以你不能通過子類來做到這一點。使用代表看起來不錯。可能會在構造函數和setter中拋出異常,或者使用'vetoable'來簡單地拒絕輸入,具體取決於對我的用法最適合的輸入。謝謝。 –

相關問題