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

时间:2018-10-02 05:34:14

标签: android kotlin

假设我有以下课程:

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>
  }
}

这是在这两个类中声明/初始化对象数组列表的最佳实践吗?

在Activity1中,我需要从服务器中获取它,并在片段中使用它,还可以根据需要将其传递给Activity2。我不想将其设置为可为空,但是初始化空数组也很奇怪。

在Activity2中,lateinit var(根据我的发现)似乎是处理此问题的最佳方法。

对于getSerializableExtra强制转换中未经检查的强制转换,我相信我可以忽略该警告,但我希望它有人可以巧妙地避免它。

3 个答案:

答案 0 :(得分:0)

您还可以在Activity1中将Lateinit var用于对象。

将对象发送到Activity2时,让Activity2处理onCreate方法中意图的空值

答案 1 :(得分:0)

您可以使用委托属性 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 }

来自here的更多内容。

答案 2 :(得分:0)

根据您的体系结构,使用状态,视图模型或其他抽象创建一些共享的类/对象,例如presenter。它应该负责网络呼叫并在现场存储值。在第一个活动中请求加载数据。然后开始第二项活动,尝试访问存储(或不存储)值的字段。如果不为null,则显示您的数据;如果不等待数据完成,则使用某种观察者模式或其他方式通知您的活动。这是更干净的方法。