おすすめ書籍はじめにこんにちは、前回に引き続き、Kotlinの基本的な文法をまとめています。今回はKotlinにおける初期化の遅延についてとなります。lazyやlateinitといったキーワードを初めて目にした時は「呼び出される時に初期化されるのね」という理解(間違いではないのですが言葉足らずでした)しかしておらず、改めて調べることでそれぞれの差異や機能の意図などを掴んでいこうと思います。初期化の遅延とはHaskellやScalaでは「遅延評価」と呼ばれているようです。今回の記事では「インスタンス生成後にプロパティの値を定義できる」という意味で初期化の遅延という表現を使っています。以下の記事で大まかな概要を理解できましたので、リンクを掲載しておきます。サンプルコードはScalaですが、概ね理解できると思います。lazy型は何でもOK一度だけ値の初期化を行う値はキャッシュされ、二回目以降は最初の値を常に返すreadonly最後の「readonly」が注意点なのですが、これは後述します。lazyの記述方法は以下のようになります。lazyの後にラムダ式が記述でき、その中で行われた処理の結果を値として、プロパティmsgが初期化されています。"引数は${n}と${d}です。{"引数は${n}と${d}です。"}}「常に同じ値を返す」という性質なので、findViewByIdで取得したViewを入れたりすると、少し厄介なことになります。newValueなどとしても変更が反映されません。これはKotlinでは有名なアンチパターンとのこと。Delegates.notNullを使います。lateinitプリミティブ型は不可val不可、varのみnullable不可private推奨(初期化が行われる前に外部からアクセスされるのを防ぐため?)「あとで必ず初期化するけど、インスタンス生成時にはできない」という時に使用します。初期化するのでnon-nullで扱うことが可能となります。val不可なので、変更されることが前提となります。onCreateViewで、findViewByIdで取得したViewなどが入ることを想定しているようです。サンプルコードは下記のようになります。プロパティで変数名だけ宣言する場合、Javaでは値がnullになりますが、lateinitを付けてonCreate内で初期化すればnon-nullとして扱えます。non-nullなので「?」不要}}Delegates.notNullDelegates.notNullはプリミティブ型に使えます。プロパティにアクセスする前に値をセットする必要があるため、下記のコードはコンパイルエラーとなります。Delegates.notNull()}下記のようにsample.nonNullMsgに値を定義してから呼び出しましょう。Delegates.notNull()}ここで「何のためにDelegates.notNullがあるんだろう、lazyかlateinitでいいんじゃないの」という疑問が湧いたのですがlazyは値が不変な場合に使うlateinitはプリミティブ型に使えないという特徴があったのでした。Delegates.notNullは「可変かつnon-nullな値の初期化を遅延したい」時に使うのが良さそうです。‘lateinit’さいごにいかがでしたでしょうか。「プロパティでnon-nullを保ちつつ、コードの途中で初期化したい。スマートな書き方で」となると、今回挙げたような記法が一例になると思います。いった記法を知っていることで、コードの書き手の意図を汲みやすく、また読み手に自分の意図を伝えやすくもなります。「書きやすく、読みやすい」コードはなかなか難しいですが、常に意識しておきたいです。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイト上に表示された文字を入力してください。最近、雨が多いですね。こんにちは、ソニーから新Aiboが発表されましたね。私たちは無料アプリもリリースしています、ぜひご覧ください。下記のアイコンから無料でダウンロードできます。