在Companion类中访问lateinit变量

时间:2018-06-27 18:03:59

标签: kotlin kotlin-lateinit

我有以下代码:

abstract class Database : RoomDatabase() {

    companion object {
        @Volatile
        lateinit var INSTANCE: Database
            private set

        fun init(context: Context) {
            val initialized = ::INSTANCE.isInitialized
            if (!initialized) {
                INSTANCE = Room.databaseBuilder(...

由于某种原因,它可以正常编译。在运行时,当应用程序在设备上启动时,将引发此异常:

  

java.lang.NoSuchFieldError:没有类型的静态字段INSTANCE   持久性/数据库;在Lpersistance / Database $ Companion类中;要么   其超类(声明为“ persistance.Database $ Companion”   出现在/data/app/split_lib_slice_1_apk.apk)中   persistance.Database $ Companion.init(Database.kt:22)

检查该类的反编译版本后,我发现INSTANCE变量在Database类中定义:

public abstract class Database extends RoomDatabase {
   private static volatile Database INSTANCE;

.IsInitialised代码实际上以这种方式在Java版本中表示:

public static final class Companion {
   public final Database getINSTANCE() {
      return Database.access$getINSTANCE$cp();
   }
   private final void setINSTANCE(Database var1) {
      Database.INSTANCE = var1;
   }

   public final void init(Context context) {
      boolean initialized = INSTANCE != null;  // error here
      if (!initialized) { ...

很明显,问题在于INSTANCE变量必须引用为Database.INSTANCE

无法理解,为什么代码可以编译但会抛出运行时异常,并且如何检查lateinit变量是否已初始化?

0 个答案:

没有答案