Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Kotlin/Native:有人能帮我建议如何创建一个接受init参数的冻结单例吗?_Ios_Kotlin_Kotlin Multiplatform_Kotlin Native - Fatal编程技术网

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尚未初始化”)
}
}
}

在这里使用原子引用有意义吗?