【问题标题】:Kotlin/Native: Can someone help me in suggesting how to create a frozen singleton that takes in init parameters?Kotlin/Native:有人可以帮助我建议如何创建一个接受 init 参数的冻结单例吗?
【发布时间】: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


【解决方案1】:

原子引用是这里的方法

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")
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2016-07-21
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多