如何使用伴随对象正确地将可变变量传递给 kotlin class?
How correctly pass changeable variable to kotlin class with companion object?
我有一些 Volley class,当我从 MainActivity 初始化它时,我将 context
和 expectedHosname
值传递给它:
VolleySingleton.getInstance(context, expectedHosname).addToRequestQueue(request)
应用程序启动后 expectedHostname
可以根据用户偏好进行更改,但 expectedHostname
在 class VolleySingleton
中始终是过时的并且具有启动值。看起来它是用第一个值编译的,当我通过 VolleySingleton.getInstance(..., ...)
.
传递新值时它不会改变
据我所知,Kotlin 中的属性可以使用 var
关键字声明,并且此变量具有隐式 getter 和 setter。所以我不明白为什么 expectedHosname
像常量一样工作。可能我必须更改我的伴随对象..?
class
的片段
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()
}
是的,expectedHostname
有一个 setter。但是您没有将其设置在任何地方;如果当你调用 getInstance
时 INSTANCE
已经是非空的,你只需 return 它。像
fun getInstance(context: Context, expectedHostname: String) =
(INSTANCE ?: synchronized(this) {
INSTANCE ?: VolleySingleton(context, expectedHostname).also {
INSTANCE = it
}
}).also { it.expectedHostname = expectedHostname }
会起作用。
我有一些 Volley class,当我从 MainActivity 初始化它时,我将 context
和 expectedHosname
值传递给它:
VolleySingleton.getInstance(context, expectedHosname).addToRequestQueue(request)
应用程序启动后 expectedHostname
可以根据用户偏好进行更改,但 expectedHostname
在 class VolleySingleton
中始终是过时的并且具有启动值。看起来它是用第一个值编译的,当我通过 VolleySingleton.getInstance(..., ...)
.
据我所知,Kotlin 中的属性可以使用 var
关键字声明,并且此变量具有隐式 getter 和 setter。所以我不明白为什么 expectedHosname
像常量一样工作。可能我必须更改我的伴随对象..?
class
的片段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()
}
是的,expectedHostname
有一个 setter。但是您没有将其设置在任何地方;如果当你调用 getInstance
时 INSTANCE
已经是非空的,你只需 return 它。像
fun getInstance(context: Context, expectedHostname: String) =
(INSTANCE ?: synchronized(this) {
INSTANCE ?: VolleySingleton(context, expectedHostname).also {
INSTANCE = it
}
}).also { it.expectedHostname = expectedHostname }
会起作用。