![](/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.