Comment vérifier si un “lateinit” variable a été initialisée?
Je me demande si il existe un moyen de vérifier si un lateinit
variable a été initialisée. Par exemple:
class Foo() {
private lateinit var myFile: File
fun bar(path: String?) {
path?.let { myFile = File(it) }
}
fun bar2() {
myFile.whateverMethod()
//May crash since I don't know whether myFile has been initialized
}
}
- Peut-être ce que vous avez besoin est de faire de la propriété nullable (changement de type de
File?
) et il suffit de vérifier si elle est null à la place? - Eh bien, j'ai effectivement essayé et il fera l'affaire, cependant, je vais avoir à modifier le
allSeries
var àseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, ce qui n'est pas très "joli" - Vous pouvez faire un simple vieux null vérifier et smart cast va le rendre encore meilleur.
if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
- Veuillez envisager d'accepter plus à jour répondre
Vous devez vous connecter pour publier un commentaire.
Il y a un
lateinit
amélioration de Kotlin 1.2 qui permet de vérifier l'état d'initialisation delateinit
variable directement:Voir l'annonce sur JetBrains blog ou la GARDER proposition.
Mise à JOUR: Kotlin 1.2 a été libéré. Vous pouvez trouver
lateinit
améliorations ici:lateinit
également pour les variables locales, voir kotlinlang.org/docs/reference/...::
avantfile
?this
mot-clé n'est pas nécessaire. Le verbose syntaxe estif (this::file.isInitialized) { ... }
Essayez de l'utiliser et vous recevrez un
UninitializedPropertyAccessException
si il n'est pas initialisé.lateinit
est spécifiquement pour les cas où les champs sont initialisés après la construction, mais avant l'utilisation réelle (un modèle qui en plus d'injection de cadres d'utilisation).Si ce n'est pas votre cas d'utilisation
lateinit
peut-être pas le bon choix.EDIT: d'après ce que vous voulez faire quelque chose comme ce serait mieux travailler:
lateinit
) a été initialisé. En d'autres termes: je veux que le bouton sera désactivé tant que la variable n'a pas été initialisé. Est-il une bonne façon de le faire?isNull
de liaison pour désactiver les autres boutons.lateinit
n'était pas vraiment la bonne solution de toute façonÀ l'aide de
.isInitialized
de la propriété on peut vérifier l'état d'initialisation d'un lateinit variable.Accepté de répondre à me donne une erreur de compilation dans
Kotlin 1.3+
, j'ai eu de mentionner explicitement lathis
mot-clé avant de::
. Ci-dessous est le code de travail.Pour vérifier si un
lateinit var
ont été initialisées ou non, l'utilisation d'un.isInitialized
sur la référence de la propriété:::
avantbar
?Bytecode dit...bla bla..
L2
LOCALVARIABLE $this l'icom/takharsh/ecdh/MainActivity; L0 L2 0
MAXSTACK = 2
MAXLOCALS = 1
Kotlin crée une variable locale supplémentaires de la même instance et vérifier si c'est null ou pas, si la valeur est null alors jette 'throwUninitializedPropertyAccessexception' d'autre retour de l'objet local.
Au-dessus de bytecode expliqué ici
Solution
Depuis kotlin 1.2 il permet de vérifier la météo lateinit var a été initialisé ou non à l'aide de
.isInitialized