繁体   English   中英

Kotlin最佳做法:声明/初始化实例变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM