2017-07-24 10 views
2

Ich möchte oft eine Zeichenfolge halten, die nicht null sein kann oder leer - Leerzeichen ist nicht gut genug. Der Compiler behandelt String? schön, um Null zu verhindern, und wir können aNullableString.isNullOrBlank() verwenden, um zu überprüfen, ob es null oder leer ist. Dies erfordert jedoch, dass der Blankoscheck überall dort gehandhabt wird, wo er verwendet wird, und dann Fehler behandelt, wenn er leer ist, was zu unerwarteten Fehlern führen kann, wenn Sie einen Punkt übersehen.Wie erzwinge ich einen leeren, nicht null String in Kotlin?

Gibt es eine einfachere Möglichkeit, einen Typ oder eine Erweiterung zu String zu definieren, der erzwingt, dass die Zeichenfolge nicht leer sein darf?

+0

Sie können einen neuen „NonEmptyString“ Typ machen, die einen String wickelt und stellt sicher, es nie leer ist, indem Sie den „Input“ Zeichenfolge an den Konstruktor gegeben zu überprüfen. Sie können auch nur Operationen für die umbrochene Zeichenfolge verfügbar machen, die nicht dazu führt, dass sie leer wird. Optional können Sie solche Operationen hinzufügen, jedoch mit Überprüfungen, um sicherzustellen, dass sie nicht zu einer leeren Zeichenfolge führen. – Alexander

Antwort

4

Wenn Sie dieses Verhalten an mehreren Stellen benötigen, können Sie einen Delegaten erstellen können es zu handhaben, wo Sie die Prüfung entweder in dem Setter des Privateigentums tun können, oder in der setValue Funktion:

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

die Verwendung dieses würde wie folgt aussehen:

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

Außerdem gibt es in ['kotlin.properties.Delegates']" beobachtbar "und" vetoable "(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.properties/-delegates/index.html) Das kann diese Implementierung etwas vereinfachen: Sie müssen die 'get/setValue (...)' -Operatoren nicht implementieren, sondern nur den Code übergeben, der die Aufgaben prüft. – hotkey

+0

Ah - String ist endgültig, Sie können dies also nicht durch eine Unterklasse tun. Die Verwendung von Delegaten sieht gut aus. Wahrscheinlich wird entweder eine Exception in den Konstruktor und den Setter geworfen, oder "vetoable" verwendet, um die Eingabe einfach abzulehnen, je nachdem, was am besten für meine Verwendung funktioniert. Danke. –

Verwandte Themen