Je me demande s'il existe un moyen de vérifier si une 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
}
}
File?
) et de vérifier simplement si elle est nulle à la place?allSeries
varseriesDir?.listFiles()?.map { it.name }?.toTypedArray()
, ce qui n'est pas très "joli"if (seriesDir != null) {
allSeries = seriesDir.listFiles().map { it.name }.toTypedArray()
}
Réponses:
Il y a une
lateinit
amélioration dans Kotlin 1.2 qui permet de vérifierlateinit
directement l' état d'initialisation de la variable:Voir l'annonce sur le blog JetBrains ou la proposition KEEP .
MISE À JOUR: Kotlin 1.2 est sorti. Vous pouvez trouver des
lateinit
améliorations ici:la source
lateinit
aussi pour les variables locales, voir kotlinlang.org/docs/reference/…::
avantfile
?En utilisant la
.isInitialized
propriété, on peut vérifier l'état d'initialisation d'une variable Lateinit.la source
Essayez de l'utiliser et vous en recevrez un
UninitializedPropertyAccessException
s'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 que la plupart des frameworks d'injection utilisent). Si ce n'est pas le cas, votre cas d'utilisationlateinit
n'est peut-être pas le bon choix.EDIT: Sur la base de ce que vous voulez faire, quelque chose comme ça fonctionnerait mieux:
la source
lateinit
) ait été initialisée. En d'autres termes: je veux que le bouton soit désactivé tant que la variable n'a pas été initialisée. Y a-t-il un bon moyen de le faire?isNull
liaison pour désactiver les autres boutons.Vous pouvez facilement le faire en:
ou
Mais si vous êtes à l'intérieur d'un écouteur ou d'une classe interne, procédez comme suit:
Remarque: Les instructions ci-dessus fonctionnent correctement si vous les écrivez dans le même fichier (même classe ou classe interne) où la variable est déclarée, mais cela ne fonctionnera pas si vous souhaitez vérifier la variable d'une autre classe (pas la superclasse ou déclarée dans un autre fichier) , par exemple:
Et pour vérifier si str est initialisé:
Ce que nous faisons ici, l'accès au domaine
str
deTest
classe enTest2
classe. Et nous obtenons un champ de sauvegarde d'erreur de var n'est pas accessible à ce stade. Consultez une question déjà posée à ce sujet.la source
La réponse acceptée me donne une erreur de compilation dans
Kotlin 1.3+
, j'ai dû mentionner explicitement lethis
mot - clé avant::
. Voici le code de travail.la source
Pour vérifier si un a
lateinit var
été initialisé ou non, utilisez un.isInitialized
sur la référence à cette propriété:la source
::
avantbar
?Bytecode dit ... bla bla ..
L2 LOCALVARIABLE $ this Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1
Kotlin crée une variable locale supplémentaire de la même instance et vérifie si elle est nulle ou non, si null lance ensuite 'throwUninitializedPropertyAccessException' sinon retourne l'objet local. Ci-dessus le bytecode expliqué ici Solution Depuis kotlin 1.2, il permet de vérifier la météo tardive var a été initialisée ou ne pas utiliser
.isInitialized
la source