我认为代码A和代码B是等价的,它们将使用以下代码返回Singleton.

preferenceParState: PreferenceParameterState = rememberPreferenceParameterState()

我用preferenceParState.hashCode()测试它们,我发现代码B可以返回Singleton,但代码A不能返回Singleton,为什么?

顺便说一句,通过我的测试,mContext.hashCode()在代码A中的不同实例中具有相同的值.

Code A

class PreferenceParameterState private constructor(context: Context) {

    companion object {     

       @Volatile private var instance: PreferenceParameterState? = null

        fun getInsance(context: Context): PreferenceParameterState{          
            return instance ?: synchronized(this) {
                instance ?: PreferenceParameterState(context)
            }
        }
    }
}


@Composable
fun rememberPreferenceParameterState(): PreferenceParameterState {
    val mContext= LocalContext.current
    return remember {
        PreferenceParameterState.getInsance(mContext)
    }
}

Code B

class PreferenceParameterState private constructor(context: Context) {
    companion object {
  
         @Volatile private var instance: PreferenceParameterState? = null
        fun getInsance(context: Context): PreferenceParameterState{
            if (instance == null) {
                synchronized(this) {
                    if (instance == null) {
                        instance = PreferenceParameterState(context)
                    }
                }
            }
            return instance!!
        }
    }
}


@Composable
fun rememberPreferenceParameterState(): PreferenceParameterState {
    val mContext= LocalContext.current
    return remember {
        PreferenceParameterState.getInsance(mContext)
    }
}

推荐答案

您的代码B所做的是基于第一次调用时传递的上下文创建一个实例.在所有后续调用中,上下文参数都被忽略.如果这真的是您想要的(不太可能),那么您可以通过更改一行代码来让代码A做同样的事情:

        return instance ?: synchronized(this) {
            instance ?: PreferenceParameterState(context).also { instance = it }
        }

但是,如果您希望每个上下文都是单例的,则可以使用ConCurrentMap:

class PreferenceParameterState private constructor(context: Context) {
    companion object {
        private val instances: ConcurrentMap<Context, PreferenceParameterState>
            = ConcurrentHashMap()

        fun getInsance(context: Context): PreferenceParameterState
            = instances.getOrPut(context) { PreferenceParameterState(context) }
    }
}

Kotlin相关问答推荐

在KMM合成多平台中创建特定于平台的视图

捕捉异常是Kotlin协程中的反模式吗?

kotlin - 挂起简单方法调用链时可能存在冗余分支

Webpack 配置未应用于 kotlin 多平台react 项目

每个 Kotlin 版本的默认 Kotlin 语言版本是什么?

如何缩短 MaterialTheme.colors.primary?

如何将glide显示的图像下载到设备存储中.Kotlin

如何在 Android 的 Fragment 中使用 setUserVisibleHint

jetpack compose 将参数传递给 viewModel

如何从定义它们的类外部调用扩展方法?

更新到版本4.10.1/4.10.2后 Gradle 同步失败

Kotlin通过映射委托属性,如果映射中不存在,则抛出NoTouchElementException

Kotlin reflect proguard SmallSortedMap

(kotlin的Moshi)@Json vs@field:Json

具有泛型param的Kotlin抽象类和使用类型param的方法

查找是否在列表中找到具有特定属性值的元素

在 Kotlin 中编写一个等于 Int.MIN_VALUE 的十六进制整数文字

使用 java lambda 调用 kotlin 函数时,Kotlin 无法访问 kotlin.jvm.functions.Function1

如何在 kotlin 中创建重复对象数组?

使用 Kotlin 按字母对数组进行排序