Was ist in Kotlin der idiomatische Weg, um Nullable-Werte zu behandeln, sie zu referenzieren oder zu konvertieren?
Wenn ich eine nullable-Typ Xyz?
möchte ich verweisen, oder wandeln Sie es in ein nicht-nullable-Typ Xyz
. Was ist die idiomatische Weise, dies zu tun in Kotlin?
Zum Beispiel, dieser code ist in Fehler:
val something: Xyz? = createPossiblyNullXyz()
something.foo() //Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Xyz?"
Aber wenn ich check null-zuerst ist es erlaubt, warum?
val something: Xyz? = createPossiblyNullXyz()
if (something != null) {
something.foo()
}
Wie kann ich die ändern oder zu behandeln, einen Wert als nicht null
ohne dass die if
überprüfen, vorausgesetzt, ich weiß, für sicher, es ist wirklich nie null
? Zum Beispiel, hier bin ich abrufen eines Wertes aus einer Karte, die ich kann-Garantie vorhanden ist und das Ergebnis get()
ist nicht null
. Aber ich habe einen Fehler:
val map = mapOf("a" to 65,"b" to 66,"c" to 67)
val something = map.get("a")
something.toLong() //Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Int?"
Die Methode get()
hält es für möglich, dass das Element fehlt, und zurück geben Int?
. Also, was ist der beste Weg, um zu erzwingen, die den Typ des Wertes keine null-Werte?
Hinweis: diese Frage ist absichtlich geschrieben und beantwortet der Autor (Selbst Beantwortete Fragen), so dass die idiomatischen Antworten auf Häufig gestellte Kotlin Themen vorhanden sind, SO. Auch zu klären, einige wirklich alte Antworten geschrieben alphas Kotlin, die nicht korrekt für den aktuellen Tag Kotlin.
InformationsquelleAutor der Frage Jayson Minard | 2015-12-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst sollten Sie Lesen Sie alles über Null Sicherheit in Kotlin, das deckt die Fälle gründlich.
In Kotlin, können Sie nicht auf eine null-Wert ohne sicher zu sein, es ist nicht
null
(Null-Bedingungen), oder behaupten, dass es ist sicherlich nichtnull
mit der!!
sicher, dass Betreiberauf es zu mit ein?.
Safe Calloder schließlich etwas geben, das möglicherweisenull
einen default-Wert mit der?:
Elvis-Operator.Für Ihren 1. Fall in deiner Frage haben Sie die Optionen, je nach der Absicht der code, den Sie verwenden Sie eine der diese, und alle sind idiomatisch, aber unterschiedliche Ergebnisse haben:
Für das "Warum funktioniert es, wenn null aktiviert" Lesen Sie hintergrund-Informationen, die unten auf smart wirft.
Für Ihren 2. Fall in deiner Frage in der Frage mit
Map
wenn Sie als Entwickler sind Sie sicher, dass das Ergebnis nienull
verwenden!!
sicher, dass Betreiber wie die eine Behauptung:oder in einem anderen Fall, wenn die Karte KÖNNTE eine null zurück, aber Sie können einen Standardwert angeben, dann
Map
selbst hat einegetOrElse
Methode:Hintergrund-Informationen:
Hinweis: in den folgenden Beispielen bin ich mit expliziten Typen, um damit das Verhalten klar. Mit Typ-Inferenz, in der Regel die Typen, die auch weggelassen werden können für lokale Variablen und private Mitglieder.
Mehr über die
!!
sicher, dass BetreiberDen
!!
Betreiber behauptet, dass der Wert nichtnull
oder wirft eine NPE. Dies sollte verwendet werden, in Fällen, in denen der Entwickler garantiert, dass der Wert nienull
. Betrachten Sie es als eine assert, gefolgt von einem smart-cast.Lesen Sie mehr: !! Sicher, Dass Betreiber
Mehr über
null
Prüfen und Smart-CastsWenn Sie schützen den Zugriff auf eine nullable-Typ mit einem
null
überprüfen, wird der compiler smart-cast der Wert innerhalb des Körpers, die Aussage zu sein, die nicht null-Werte zulassen. Es gibt einige komplizierte fließt, wo dies nicht passieren kann, aber für Allgemeine Fälle funktioniert.Oder wenn Sie eine
is
überprüfen Sie, ob ein nicht-nullable-Typ:Und das gleiche für die 'wenn' - Ausdrücke, die auch die sichere Besetzung:
Einige Dinge nicht erlauben, die
null
überprüfen smart-cast für die spätere Verwendung der variable. Das obige Beispiel verwendet eine lokale variable, die in keiner Weise haben könnten, mutierte in den Ablauf der Anwendung, obval
odervar
diese variable hatte keine Gelegenheit, zu mutierennull
. Aber, in anderen Fällen, wo der compiler kann nicht garantieren, das flow-Analyse, dies wäre ein Fehler:Den Lebenszyklus der variable
nullableInt
ist nicht vollständig sichtbar ist und zugewiesen werden kann von anderen threads, dienull
check nicht smart-cast in eine nicht nullwertfähige Wert. Siehe "Sichere Anrufe" Thema unter einem workaround.Einem anderen Fall, die nicht vertrauenswürdig sind, indem Sie eine smart-cast nicht mutieren, ist ein
val
- Eigenschaft auf ein Objekt, hat eine eigene getter. In diesem Fall hat der compiler keinen Einblick in was mutiert, die den Wert und daher werden Sie eine Fehlermeldung bekommen:Lesen Sie mehr: Null-Bedingungen
Mehr über die
?.
Safe Call operatorDen sicheren Aufruf-operator null zurück, wenn der Wert auf der linken Seite null ist, andernfalls weiter zum auswerten des Ausdrucks auf der rechten Seite.
Weiteres Beispiel, wo Sie wollen, um die Iteration einer Liste, aber nur, wenn nicht
null
und nicht leer ist, wieder die safe-call-Netzbetreiber kommt in handliches:In einem der Beispiele oben hatten wir einen Fall, wo wir eine
if
prüfen, aber die chance haben, einen anderen thread mutiert der Wert und somit keine smart-cast. Wir können dieses Beispiel verwenden Sie die safe-Aufruf-operator zusammen mit derlet
Funktion um dieses Problem zu lösen:Lesen Sie mehr: Sichere Anrufe
Mehr über die
?:
Elvis-OperatorDen Elvis-operator können Sie eine alternative Wert, wenn ein Ausdruck Links neben dem operator ist
null
:Es hat einige kreative Weise verwendet werden, beispielsweise eine exception werfen, wenn etwas ist
null
:oder zu frühen Rückkehr aus einer Funktion:
Lesen Sie mehr: Elvis-Operator
Null-Operatoren mit Zugehörigen Funktionen
Kotlin stdlib hat eine Reihe von Funktionen, dass die Arbeit wirklich gut mit dem Betreiber die oben erwähnt werden. Zum Beispiel:
Verwandte Themen
In Kotlin, die meisten Anwendungen versuchen zu vermeiden
null
Werte, aber es ist nicht immer möglich. Und manchmalnull
macht auch Sinn. Einige Richtlinien zu denken:in einigen Fällen ist es garantiert unterschiedliche Rückgabe-Typen, gehören der status der Methode aufrufen und das Ergebnis, wenn erfolgreich. Bibliotheken wie Ergebnis geben Sie ein Erfolg oder Misserfolg Ergebnis geben kann, die auch branch-code. Und die Versprechen, die Bibliothek für Kotlin genannt Kovenant das gleiche tut, in form von Versprechungen.
für Sammlungen als return-Typen immer wieder eine leere Sammlung statt einer
null
es sei denn, Sie benötigen einen Dritten Zustand "nicht vorhanden". Kotlin hat Hilfsfunktionen wieemptyList()
oderemptySet()
zu erstellen, diese leeren Werte.beim Einsatz von Methoden, welche Rendite eine null-Wert, für die Sie eine Standard-oder alternative verwenden Sie die Elvis-operator, um einen Standardwert angeben. Im Falle einer
Map
verwenden Sie diegetOrElse()
was kann ein default-Wert generiert werden, anstelle vonMap
Methodeget()
gibt eine null-Wert. Gleiche fürgetOrPut()
beim überschreiben der Methoden von Java Kotlin, wo nicht sicher ist, über die Zulässigkeit der Java-code, können Sie immer drop, die
?
Zulässigkeit von Ihr überschrieben, wenn Sie sicher sind, was die Signatur und Funktionalität werden sollte. Daher Ihre überschriebenen Methode ist mehrnull
sicher. Gleiche für die Implementierung von Java-Schnittstellen in Kotlin, ändern Sie die null-Zulässigkeit zu werden, was Sie wissen gültig ist.Blick auf die Funktionen, die können schon helfen, wie zum
- String?.isNullOrEmpty()
und- String?.isNullOrBlank()
die den Betrieb auf eine null-Werte sicher und tun, was Sie erwarten. In der Tat, können Sie Ihre eigenen Erweiterungen und Lücken in der standard-Bibliothek.Geltendmachung Funktionen wie
checkNotNull()
undrequireNotNull()
in der standard-Bibliothek.Hilfsfunktionen wie
filterNotNull()
dem entfernen null-Werte aus Sammlungen, oderlistOfNotNull()
für die Rückgabe eines null-oder single-item-Liste, die von einer möglicherweisenull
Wert.es ist ein Safe (nullable) cast-operator wie gut, dass es ein " cast to non-nullable-Typ null zurückgeben, falls nicht möglich. Aber ich habe nicht einen gültigen Anwendungsfall für diese, die nicht gelöst wird durch die anderen genannten Verfahren.
InformationsquelleAutor der Antwort Jayson Minard
Die Vorherige Antwort ist eine harte Handlung zu Folgen, aber hier ist eine schnelle und einfache Möglichkeit:
Wenn es wirklich ist nie null, die Ausnahme wird nicht passieren, aber wenn es immer ist, du wirst sehen, was falsch gelaufen ist.
InformationsquelleAutor der Antwort John Farrell