J'essaie de vérifier si un lateinit
a été initialisée.
Dans Kotlin 1.2, nous disposons désormais de la fonction isInitialized
pour cela. Cela fonctionne lorsque je fais cela dans la classe où la propriété lateinit est déclarée. Mais lorsque j'essaie d'appeler cette méthode depuis une autre classe, j'obtiens l'avertissement suivant :
Le champ de sauvegarde de 'lateinit var foo : Bar' n'est pas accessible à ce stade
Ma classe modèle (disons Person
) est écrit en Java
Deux autres classes (disons Test1
y Test2
) sont écrits en Kotlin
Exemple :
class Test1 {
lateinit var person: Person
fun method() {
if (::person.isInitialized) {
// This works
}
}
}
-
class Test2 {
lateinit var test1: Test1
fun method() {
if (test1::person.isInitialized) {
// Error
}
}
}
Y a-t-il une chance que cela fonctionne ?
Ma solution actuelle consiste à créer une méthode dans Test1 qui renvoie les résultats suivants isInitialized
de la person
propriété.
fun isPersonInitialized(): Boolean = ::person.isInitialized
//in Test2:
if (test1.isPersonInitialized()) {
// Works
}
0 votes
Je ne connais pas la réponse. Mais pourquoi vous utilisez
isInitialized
sur nullable ?lateinit
doivent toujours être initialisés avant l'objet utilisé.0 votes
@Eledgy votre code ne compile pas. vous ne pouvez pas mettre une expression if directement dans le corps d'une classe. je pense que vous avez oublié de l'envelopper dans un bloc init. je sais, cela ne résout pas votre problème initial.
0 votes
Joshua, j'ai un cas où la personne n'est pas encore initialisée.
0 votes
@WilliMentzel C'est juste un exemple, j'ai mis le code dans une méthode
1 votes
@ElegyD Alors, vous devriez utiliser
Person?
. Si vous abusezlateinit
Dans ce cas, vous avez besoin d'un if à chaque fois que vous accédez à une personne, ce qui vous oblige à revenir à Java avec la vérification des nullités.0 votes
J'ai eu le même problème en utilisant un
protected lateinit var
dans une superclasse et ensuite appeler isInitialized depuis une sous-classe. Il semble que l'implémentation Java sous-jacente enveloppe simplement la variable avecif(variable != null) {}
donc cela semble étrange.