簡體   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