web-dev-qa-db-fra.com

isInitialized - Le champ de sauvegarde de lateinit var n'est pas accessible à ce stade

J'essaie de vérifier si une propriété lateinit a été initialisée.
Dans Kotlin 1.2, nous avons maintenant la méthode 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 cela depuis une autre classe, l'avertissement suivant s'affiche: 

Le champ de support de 'lateinit var foo: Bar' n'est pas accessible pour le moment.

Ma classe de modèle (disons Person) est écrite en Java
Deux autres classes (disons Test1 et Test2) sont écrites 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
        }
    }
}

Avez-vous une chance de réussir? 

Ma solution actuelle consiste à créer une méthode dans Test1 qui renvoie isInitialized à partir de la propriété person

fun isPersonInitialized(): Boolean = ::person.isInitialized

//in Test2:
if (test1.isPersonInitialized()) {
    // Works
}
19
ElegyD

Selon les docs :

Cette vérification n’est disponible que pour les propriétés accessibles lexicalement, c’est-à-dire déclarées dans le même type ou dans l’un des types externes, ou au niveau supérieur dans le même fichier.

C'est pourquoi vous ne pouvez pas vérifier cela dans la fonction principale.

4
Raghavendra

Une solution de contournement très simple aux contraintes décrites par la réponse acceptée est la suivante:

class LateClass {
    lateinit var thing: Thing
    fun isThingInitialized() = ::thing.isInitialized
}

class Client {
    val lateClass = LateClass()
    ... things happen ...
    if (lateClass.isThingInitialized() {
        // do stuff with lateClass.thing, safely
    }
}
10
AutonomousApps

Vous pouvez vérifier si une propriété lateinit a été initialisée en interceptant UninitializedPropertyAccessException comme ceci:

class Person {
    lateinit var name: String
}

class Test {
    lateinit var person1: Person
    lateinit var person2: Person

    init {
        try {
            println(person1.name)
        }
        catch(e: UninitializedPropertyAccessException) { // is thrown because person1 has not been initialized
            println("ups")
        }

        person2 = Person()

        try {
            println(person2.name)
        }
        catch(e: UninitializedPropertyAccessException) { // is thrown because person2.name has not been initialized
            println("ups")
        }
    }
}

fun main(args: Array<String>) {
   Test() // ups ups
}
0
Willi Mentzel