首页 > 解决方案 > 如何正确地将可变变量传递给带有伴随对象的 kotlin 类?

问题描述

我有一些 Volley 类,当我从 MainActivity 初始化它时,我将context值传递expectedHosname给它:

VolleySingleton.getInstance(context, expectedHosname).addToRequestQueue(request)

应用启动后expectedHostname可以根据用户偏好进行更改,但expectedHostname在类内总是过时的VolleySingleton并且具有启动价值。它看起来像是用第一个值编译的,当我通过新值时它不会改变VolleySingleton.getInstance(..., ...)

据我所知,Kotlin 中的属性可以用var关键字声明,并且该变量具有隐式 getter 和 setter。所以我不明白为什么expectedHosname像一个常数一样工作。可能我必须改变我的伴侣对象..?

类的片段

class VolleySingleton constructor(context: Context, private var expectedHostname: String) {
    companion object {
        @Volatile
        private var INSTANCE: VolleySingleton? = null
        fun getInstance(context: Context, expectedHostname: String) =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: VolleySingleton(context, expectedHostname).also {
                    INSTANCE = it
                }
            }
    }

    private fun sslSocketFactory(context: Context, expectedHost: String): SSLSocketFactory {
         // magic with expectedHost var
    }

    //OR
    private val foo: String = expectedHost.toUpperCase()
}

标签: classkotlinandroid-volleyvar

解决方案


是的,expectedHostname有一个二传手。但是您不要将其设置在任何地方;如果INSTANCE你调用时已经是非空的getInstance,你只需返回它。就像是

fun getInstance(context: Context, expectedHostname: String) =
    (INSTANCE ?: synchronized(this) {
        INSTANCE ?: VolleySingleton(context, expectedHostname).also {
            INSTANCE = it
        }
    }).also { it.expectedHostname = expectedHostname }

将工作。


推荐阅读