when setters que not lateinit getters and allowed java kotlin kotlin-lateinit

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