【发布时间】:2019-12-26 06:45:34
【问题描述】:
下面的代码将不起作用,因为一旦我们尝试像SomeClass.getInstance() 或它的任何其他属性一样访问它,伴随对象将被创建并使其不可变,我将无法初始化someClass 属性。我希望它是不可变的/冻结的(因为这将被多个线程访问)但是当它接受参数时我不能这样做。
有什么建议吗?
actual open class SomeClass private constructor(private val someProperty: SomeProperty) {
actual companion object {
private var someClass: SomeClass? = null
fun initialize(someProperty: SomeProperty){
someClass = SomeClass(someProperty)
}
actual fun getInstance(): SomeClass {
if (someClass == null) {
throw UninitializedPropertyAccessException("SomeClass is not initialised yet")
}
return someClass as SomeClass
}
}
}
一种可能的解决方案是在此处使用 AtomicReference。像这样:
actual open class SomeClass private constructor(private val someProperty: SomeProperty) {
actual companion object {
private var someClassAtomicRef: AtomicReference<SomeClass?> = AtomicReference(null)
fun initialize(someProperty: SomeProperty){
val someClass = SomeClass(someProperty)
someClassAtomicRef.value = someClass.freeze()
}
actual fun getInstance(): SomeClass {
return someClassAtomicRef.value ?: throw UninitializedPropertyAccessException("SomeClass is not initialised yet")
}
}
}
上面代码的问题是我可以再次调用SomeClass.initialise 并在AtomicReference 中有另一个SomeClass 实例。
有没有更好的方法来实现这一点?
【问题讨论】:
-
在这里使用 AtomicReference 有意义吗?
标签: ios kotlin kotlin-multiplatform kotlin-native