この記事は
iOSに最近触れる機会があって、lazyプロパティに沢山出会いました。
その際に、改めて普通の宣言と何が違うのだろう?と疑問に感じました。
それを解消させる記事にしたいと思います。
初期化の遅延とは?
文字通り、初期化の「遅延」を実現してくれます。
kotlinだと、初期化を遅延する言語仕様は二つありますね。
lateinit
がvar
、non-null
で宣言し、予約語の型が使えないなどの制約があります。
lazy
の方は、val
、初期化後は同じ値を返し続けるなどの制約があります。
private lateinit var sonic: Sonic
private val speed: Int by lazy { 1000 }
このような宣言をすることで、これらの値は最初の呼び出し時に初めて初期化することが出来ます。
使いどころ
文法的な事は掴めても、それの何がいいの?というのがあるあるかなと思います。
重いプロパティがあるとき便利
初期化するのに計算コストが割とかかってしまうもの関しては、やはり遅延させた方がパフォーマンスとしては良いと思います。
これは、他のオブジェクトに依存していたり、使用箇所が少ないなどあるとクラス作成するタイミングでは初期化不要となります。
var
やnull
をセットを回避できる
lateinit
とlazy
を使用しない場合
private var sonic: Sonic? = null
こんな感じで、var
かつnullable
にするしかない・・
しかし、lazy
の方を用いることでval
かつnon-null
な値を持つことが出来るようになります。
まとめ
このくらいかな?
他にメリットがあれば、教えて頂きたいです!
自分が見たあのlazyが使われていた箇所は、割と重いオブジェクトだったのかな。
また、lazy
とlateinit
は仕様が異なるので上手く使いたい所です。
参考