【问题标题】:Kotlin best practices: declare/init instance variablesKotlin 最佳实践:声明/初始化实例变量
【发布时间】:2018-10-02 16:23:30
【问题描述】:

假设我有以下课程:

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 演员表中未经检查的演员表,我相信我可以忽略警告,但我希望有人有一个巧妙的技巧来避免它。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    您也可以在 Activity1 中为对象使用 lateinit var。

    当您将对象发送到 Activity2 时,让 Activity2 在 onCreate 方法中处理来自 Intent 的 null 值

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        根据您的架构创建一些共享类/对象,例如具有状态、视图模型或其他抽象的演示者。它应该负责网络调用和在字段中存储值。请求在第一个活动中加载数据。然后开始第二个活动尝试访问存储(或不存储)值的字段。如果它不为空,则显示您的数据,如果它不等待它完成,然后使用某种观察者模式或其他东西通知您的活动。这是更干净的方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-07
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多