【问题标题】:Call Kotlin function in Java在 Java 中调用 Kotlin 函数
【发布时间】:2018-12-11 22:54:27
【问题描述】:

我是 Kotlin 的新手。我需要从 Java 类调用在 Kotlin 中创建的类中的方法。 有问题的类涉及数据库的创建。

@Database(entities = arrayOf(Indirizzo::class, Dispositivo::class), version = 1, exportSchema = false)
abstract class WppDb : RoomDatabase() {
    abstract fun DispositivoDao(): DispositivoDao
    abstract fun IndirizzoDao(): IndirizzoDao

    private var INSTANCE : WppDb? = null

    fun getInstance(context: Context): WppDb? {
        if (INSTANCE == null) {
            synchronized(WppDb::class) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            WppDb::class.java, "weather.db")
                           .build()
            }
        }
        return INSTANCE
    }

    fun destroyInstance() {
        INSTANCE = null
    }
}

我需要从 Java Activity 调用 getInstance() 方法。

【问题讨论】:

标签: java android sqlite kotlin android-room


【解决方案1】:

如果您想要与 Room 示例通常显示的等效的静态 Java 字段和静态 getter 方法,您可以将这些函数放在您的类的 companion object 中:

@Database(entities = arrayOf(Indirizzo::class, Dispositivo::class), version = 1, exportSchema = false)
abstract class WppDb : RoomDatabase() {
    abstract fun DispositivoDao(): DispositivoDao
    abstract fun IndirizzoDao() : IndirizzoDao

    companion object {
        private var INSTANCE : WppDb? =  null

        @JvmStatic
        fun getInstance(context: Context): WppDb? {
            if (INSTANCE == null) {
                synchronized(WppDb::class) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                    WppDb::class.java, "weather.db")
                                   .build()
                }
            }
            return INSTANCE
        }

        @JvmStatic
        fun destroyInstance() {
            INSTANCE = null
        }
    }
}

然后您可以从 Kotlin 或 Java 代码调用 WppDb.getInstance(context)。请注意 @JvmStatic 注释,它使这些调用在 Java 中更好 - 没有它们,您必须使用 WppDb.Companion 来获取伴随对象,然后在其上调用 getInstance 函数(所以完全是 WppDb.Companion.getInstance(context) )。

【讨论】:

  • 我收到error: INSTANCE has private access。如果没有@JvmStatic 注解怎么办(对于其他一些SDK,我无法更改代码)?
  • 我认为答案有误,如果您在访问器方法上没有@JvmStatic,那么您在Java中的语法将是WppDb.Companion.getInstance(context)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多