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
}
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.
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
}
}
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
}