Ios Kotlin/Native:有人能帮我建议如何创建一个接受init参数的冻结单例吗?
下面的代码将不起作用,因为当我们尝试像Ios Kotlin/Native:有人能帮我建议如何创建一个接受init参数的冻结单例吗?,ios,kotlin,kotlin-multiplatform,kotlin-native,Ios,Kotlin,Kotlin Multiplatform,Kotlin Native,下面的代码将不起作用,因为当我们尝试像SomeClass.getInstance()或它的任何其他属性一样访问它时,伴随对象将被创建并变为不可变,我将无法初始化SomeClass属性。我希望它是不可变的/冻结的(因为这将从多个线程访问),但当它需要参数时,我不能这样做 有什么建议吗 actual open class SomeClass private constructor(private val someProperty: SomeProperty) { actual compani
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
}
}
}
一个可能的解决方案是在这里使用原子引用。像这样:
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私有构造函数(private val someProperty:someProperty){
实际伴星{
私有变量someClassAtomicRef:AtomicReference=AtomicReference(null)
乐趣初始化(someProperty:someProperty){
val someClass=someClass(someProperty)
someClassAtomicRef.value=someClass.freeze()
}
实际有趣的getInstance():SomeClass{
返回someClassAtomicRef.value?:抛出UninitializedPropertyAccessException(“SomeClass尚未初始化”)
}
}
}
上面代码的问题是我可以调用SomeClass.initialise
,然后在AtomicReference中有另一个SomeClass实例
有更好的方法来实现这一点吗?原子引用是实现这一点的方法
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.compareAndSet(null, someClass.freeze())
}
actual fun getInstance(): SomeClass {
return someClassAtomicRef.value ?: throw UninitializedPropertyAccessException("SomeClass is not initialised yet")
}
}
}
实际打开的类SomeClass私有构造函数(private val someProperty:someProperty){
实际伴星{
私有变量someClassAtomicRef:AtomicReference=AtomicReference(null)
乐趣初始化(someProperty:someProperty){
val someClass=someClass(someProperty)
someClassAtomicRef.compareAndSet(null,someClass.freeze())
}
实际有趣的getInstance():SomeClass{
返回someClassAtomicRef.value?:抛出UninitializedPropertyAccessException(“SomeClass尚未初始化”)
}
}
}
在这里使用原子引用有意义吗?