Android lateinit的isInitialized属性Is';t在伴生物体中工作
我有一个以java方式实现的单例类:Android lateinit的isInitialized属性Is';t在伴生物体中工作,android,kotlin,singleton,Android,Kotlin,Singleton,我有一个以java方式实现的单例类: companion object { @Volatile private lateinit var instance: TrapBridge fun bridge(): TrapBridge { if (!this::instance.isInitialized) { synchronized(this) { if (!this::instance.isInitial
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
}
}
现在的问题是我不能使用isInitialized
属性,因为它抛出NoSuchFieldError
异常:
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)
我认为这是因为instance
是类变量而不是实例变量,所以我不能用这个关键字来引用它:/
此外,我无法检查它是否为null,因为它引发了未初始化的PropertyAccessException
:
lateinit property instance has not been initialized
不幸的是,这是一个已知的问题,在官方的Kotlin问题跟踪程序上进行了跟踪。我也遇到了同样的问题,并找到了另一种解决方法:
@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()
}
}
}
我认为当前的解决方法是使用单独的布尔值变量或可为空的数据类型,对吗?是的@Maxim您可以使用可为空的类型并在Jetbrains tracker上对该问题进行表决。这似乎只会影响同伴对象。在kotlin multiplatform中的一个非同伴对象在公共部分也有同样的问题private lateinit var myList:List
其中::myList.isInitialized
被忽略,但::myList.IsaStract
起作用