java - setters - isInitialized-El campo de respaldo de lateinit var no está accesible en este punto
public var kotlin (3)
Estoy tratando de verificar si una propiedad de lateinit
se ha inicializado.
En Kotlin 1.2 ahora tenemos el método isInitialized
para eso. Funciona cuando lo hago en la clase en la que se declara la propiedad lateinit. Pero cuando trato de llamar a esto desde otra clase, recibo la siguiente advertencia:
El campo de respaldo de ''lateinit var foo: Bar'' no está accesible en este punto
Mi modelo de clase (digamos Person
) está escrito en Java
Otras dos clases (digamos Test1
y Test2
) están escritas en Kotlin
Ejemplo:
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
}
}
}
¿Alguna posibilidad de hacer que esto funcione?
Mi solución actual es hacer un método en Test1 que devuelva isInitialized
de la propiedad person
.
fun isPersonInitialized(): Boolean = ::person.isInitialized
//in Test2:
if (test1.isPersonInitialized()) {
// Works
}
Puede verificar si una propiedad de lateinit
se ha inicializado capturando la lateinit
así:
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
}
Según los docs :
Esta verificación solo está disponible para las propiedades que son accesibles léxicamente, es decir, declaradas en el mismo tipo o en uno de los tipos externos, o en el nivel superior en el mismo archivo.
Es por eso que no puedes verificar eso en la función principal.
Una solución muy simple a las restricciones descritas por la respuesta aceptada es la siguiente:
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
}
}