初期化タイミングを変数を初めて使用する時に初期化する
lateinit、by lazy
プリミティブ型には使用できない。
varで宣言する必要がある。
必ずnon-nullとなる。
class MainActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(saveInstanceState: Bundle?) {
super.onCreate(saveInstanceState)
textView = findViewById(R.id.text_view) // ここで初めて初期化される
}
// …
}
varで宣言するので、再代入には注意すること。
by lazy
型の制限はない。
valで宣言する必要がある。
nullable / nun-nullどちらでも可能
対象のプロパティが初めて呼び出されたときに初期化される。
初期化されたら必ず同じ値を返す。
class MainActivity : AppCompatActivity() {
private val userData: User? by lazy { fetchUserData() }
override fun onCreate(saveInstanceState: Bundle?) {
super.onCreate(saveInstanceState)
userData?.let { showUserData(it) } // ここで初めて初期化される
}
// …
}
ビューをlazyで初期化した場合、変更を加えても反映されない。
プロパティーにnullが入る可能性がある場合はlazyを使う必要がある。
by lazyは初期化処理を記述する必要があるので、記述上各メソッドの処理はスッキリさせることができる。
Qiita 【Android】lateinitとby lazyの使い分け【Kotlin】 https://qiita.com/u-dai/items/a31c5c2a7d5c7ed2cc47