Как правильно передать переменную переменную в класс kotlin с сопутствующим объектом? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть некоторый класс Volley, и когда я инициализирую его из MainActivity, я передаю ему значения context и expectedHosname:

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

После запуска приложения expectedHostname можно изменить в соответствии с предпочтениями пользователя, но expectedHostname всегда устарел внутри класса VolleySingleton и имеет начальное значение.Похоже, что оно скомпилировано с первым значением и не изменяется, когда я передаю новое через VolleySingleton.getInstance(..., ...).

. Как я знаю, свойства в Kotlin могут быть объявлены с ключевым словом var, и эта переменная имеет неявный getter исеттер.Поэтому я не могу понять, почему 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()
}

1 Ответ

0 голосов
/ 24 сентября 2019

Да, expectedHostname имеет установщик.Но вы нигде не устанавливаете это;если INSTANCE уже ненулевой, когда вы звоните getInstance, вы просто возвращаете его.Будет работать что-то вроде

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

.

...