class - 如何正确地将可变变量传递给带有伴随对象的 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()
}
解决方案
是的,expectedHostname
有一个二传手。但是您不要将其设置在任何地方;如果INSTANCE
你调用时已经是非空的getInstance
,你只需返回它。就像是
fun getInstance(context: Context, expectedHostname: String) =
(INSTANCE ?: synchronized(this) {
INSTANCE ?: VolleySingleton(context, expectedHostname).also {
INSTANCE = it
}
}).also { it.expectedHostname = expectedHostname }
将工作。
推荐阅读
- android - 从 Android JobService 绑定到 Android 服务
- python - 为什么 python3.7 使用 re.split() 返回与 python3.6(anaconda) 不同的输出?
- javascript - 将变量传递到 document.getElementById() - Javascript
- json - laravel 按数据字段为用户选择通知
- chapel - 各种计算的性能图
- smartcontracts - 如何设置每天/每周/每月支付的合同..从发送方到接收方的 XAS?
- javascript - 使用 AJAX 将数据发布到 Google 表单
- swift - 包括特殊字符的 Swift 字符串
- entity-framework-core - 无法使用 Entity Framework Core 2.1 更新子实体
- c++ - 静态分配的纯虚拟父类引用对静态分配的子类对象是否合法?