2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Kotlin]lazyとlateinit

Last updated at Posted at 2022-01-16

この記事は

iOSに最近触れる機会があって、lazyプロパティに沢山出会いました。
その際に、改めて普通の宣言と何が違うのだろう?と疑問に感じました。
それを解消させる記事にしたいと思います。

初期化の遅延とは?

文字通り、初期化の「遅延」を実現してくれます。

kotlinだと、初期化を遅延する言語仕様は二つありますね。
lateinitvarnon-nullで宣言し、予約語の型が使えないなどの制約があります。
lazyの方は、val、初期化後は同じ値を返し続けるなどの制約があります。

private lateinit var sonic: Sonic
private val speed: Int by lazy { 1000 }

このような宣言をすることで、これらの値は最初の呼び出し時に初めて初期化することが出来ます。

使いどころ

文法的な事は掴めても、それの何がいいの?というのがあるあるかなと思います。

重いプロパティがあるとき便利

初期化するのに計算コストが割とかかってしまうもの関しては、やはり遅延させた方がパフォーマンスとしては良いと思います。
これは、他のオブジェクトに依存していたり、使用箇所が少ないなどあるとクラス作成するタイミングでは初期化不要となります。

varnullをセットを回避できる

lateinitlazyを使用しない場合

private var sonic: Sonic? = null

こんな感じで、varかつnullableにするしかない・・
しかし、lazyの方を用いることでvalかつnon-nullな値を持つことが出来るようになります。

まとめ

このくらいかな?
他にメリットがあれば、教えて頂きたいです!

自分が見たあのlazyが使われていた箇所は、割と重いオブジェクトだったのかな。
また、lazylateinitは仕様が異なるので上手く使いたい所です。

参考

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?