![](/img/trans.png)
[英]Best way to declare value in Kotlin class : in Constructor, body or init{}
[英]Kotlin best practices: declare/init instance variables
假设我有以下课程:
class Activity1: Activity {
private var objects = arrayListOf<MyObject>()
override fun onCreate(...) {
...
Thread {
getThoseObjects() {
this.runOnUiThread {
objects = it
//load a fragment using objects
val fragment = MyFragment.newInstance(objects)
}
}
}.start()
}
fun startActivity2() {
val i = Activity2.newIntent(objects)
...
}
}
class Activity2: Activity {
private lateinit var objects: ArrayList<MyObject>
override onCreate(...) {
objects = intent.getSerializableExtra(MY_KEY) as ArrayList<MyObject>
}
}
这是在这两个类中声明/初始化对象arraylist的公认最佳实践吗?
在Activity1中,我需要从服务器中获取它,并在片段中使用它,还可以在需要时将其传递给Activity2。 我不想将其设置为可为空,但对初始化空数组也感到很奇怪。
在Activity2中,lateinit var(根据我的发现)似乎是处理该问题的最佳方法。
至于getSerializableExtra强制转换中未经检查的强制转换,我相信我可以忽略该警告,但我希望它有人可以巧妙地避免它。
您还可以在Activity1中为对象使用lateinit var。
将对象发送到Activity2时,让Activity2处理onCreate方法中意图的空值
您可以使用委托属性lazy进行初始化。
根据您的方案,您正在从API获取数据(这意味着将来),并且惰性块用于在调用访问而不是声明时进行val初始化。
因此,对于Activity1,它将类似于:
private val objects by lazy { return@lazy arrayListOf<MyObject>()}
对于活动2:
private val objects: ArrayList<MyObject>? by lazy { return@lazy (intent?.getSerializableExtra(MY_KEY) as ArrayList<MyObject>) ?: null }
从这里更多。
根据您的架构,使用状态,视图模型或其他抽象来创建一些共享的类/对象,例如presenter。 它应该负责网络呼叫并在现场存储值。 在第一个活动中请求加载数据。 然后开始第二项活动,尝试访问存储(或不存储)值的字段。 如果不为null,则显示您的数据;如果不等待数据完成,则使用某种观察者模式或其他方式通知您的活动。 这是更干净的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.