isInitialized - Backing field of lateinit var is not accessible at this point

JavaKotlinKotlin Lateinit

Java Problem Overview


I'm trying to check if a lateinit property has been initialized.
In Kotlin 1.2 we now have the isInitialized method for that. It works when I do that in the class where the lateinit property is declared. But when I try to call this from another class I get the following warning:

> Backing field of 'lateinit var foo: Bar' is not accessible at this point

My model class (let's say Person) is written in Java
Two other classes (let's say Test1 and Test2) are written in Kotlin

Example:

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

Any chance to get this working?

My current workaround is to make a method in Test1 which returns isInitialized from the person property.

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

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

Java Solutions


Solution 1 - Java

A really simple workaround to the constraints described by the accepted answer is the following:

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

Solution 2 - Java

According to the docs:

> This check is only available for the properties that are lexically accessible, i.e. declared in the same type or in one of the outer types, or at top level in the same file.

Which is why you cannot check that in the main function.

Solution 3 - Java

My version as a Kotlin property.

class LateClass {
    lateinit var thing: Thing
    val isThingInitialized get() = this::thing.isInitialized 
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionElegyDView Question on Stackoverflow
Solution 1 - JavaAutonomousAppsView Answer on Stackoverflow
Solution 2 - JavaRaghavendraView Answer on Stackoverflow
Solution 3 - JavaSattar HummatliView Answer on Stackoverflow