isInitialized property for lateinit isn't work

2019-02-13 22:35发布

问题:

I have a singleton class which i have implemented it in java fashion :

companion object {

    @Volatile private lateinit var instance: TrapBridge

    fun bridge(): TrapBridge {
        if (!this::instance.isInitialized) {
            synchronized(this) {
                if (!this::instance.isInitialized) {
                    instance = TrapBridge()
                }
            }
        }
        return instance
    }

}

now the problem is i can't use isInitialized property because it throws NoSuchFieldError exception :

java.lang.NoSuchFieldError: No field instance of type Lcom/sample/trap/model/TrapBridge; in class Lcom/sample/trap/model/TrapBridge$Companion; or its superclasses (declaration of 'com.sample.trap.model.TrapBridge$Companion' appears in /data/app/com.sample.trapsample-L9D8b2vxEQfiSg9Qep_eNw==/base.apk)

and i think it's because instance is class variable and not instance variable so i can't reference it with this keyword :/

also i can't check if it's null because it throws UninitializedPropertyAccessException :

lateinit property instance has not been initialized

回答1:

Unfortunately this is a known issue, tracked here on the official Kotlin issue tracker.



回答2:

I had the same issue and found another way to do this:

@Volatile
private lateinit var box: BoxStore
class BoxKeeper private constructor() {
    companion object {
        var instance: BoxStore
            get() = box
            set(_) {}

        fun init(context: Context) {
            if (::box.isInitialized.not())
                box = MyObjectBox.builder().androidContext(context).build()
        }

    }
}