Android
 Computer >> コンピューター >  >> プログラミング >> Android

Kotlin入門:lazyとlateinitによるプロパティ初期化の違いと使い方

Kotlinには、プロパティ(変数)の宣言時に利用できる2つの異なる初期化手法が用意されています。それが「lateinit」と「lazy」です。

本記事では、この2つの仕組みの違いと、それぞれをアプリケーションでどのように活用できるのかを詳しく解説します。

lateinitとは

変数を「lateinit」として宣言するには、その変数にキーワード「lateinit」を修飾子として付けるだけです。Kotlinで「lateinit」を使用する際は、以下の条件を満たす必要があります。

  • ミュータブルな変数(可変変数)にのみ使用できます。つまり、「var」キーワードと組み合わせる必要があります。

  • NULL非許容型(Non-Nullable型)にのみ使用できます。

  • IntやBooleanなどのプリミティブ型では使用できません。

  • カスタムのgettersetterを持たないプロパティにのみ使用できます。

なお、初期化前にlateinit変数へアクセスすると「UninitializedPropertyAccessException」がスローされるため、事前に値が代入されているかどうかを確認することが重要です。

コード例

ここでは、変数をlateinitとして宣言し、プログラム内からどのようにアクセスするかを見ていきます。

class Tutorial {

    lateinit var name : String

    fun checkLateInit(){
        // 値が代入済みかどうかをチェック
        if(this::name.isInitialized)
            println("値はすでに代入されています")

        else{
            // nameを初期化
            name = "www.tutorialspoint.com/"
            println(this.name)
        }
    }
}

fun main() {
    var obj = Tutorial()
    obj.checkLateInit()
}

実行結果

上記のコードを実行すると、次の出力が得られます。

www.tutorialspoint.com/

Lazy初期化とは

効率的なメモリ管理を実現するために、Kotlinには「遅延初期化(Lazy initialization)」という機能が導入されています。lazyを使用すると、オブジェクトは実際に呼び出されたタイミングでのみ生成され、それまではオブジェクトの生成自体が行われません。

lazy()はラムダ式を受け取り、Lazyインスタンスを返す関数です。このインスタンスは、適用された遅延プロパティのデリゲートとして機能します。不要なオブジェクトの初期化を防ぐために設計されています。

  • NULL非許容型の変数にのみ使用できます。

  • 変数は「val」のみ許可され、「var」は使用できません。

  • オブジェクトは一度だけ初期化され、以降はキャッシュされた値が返されます。

  • アプリケーション内で実際に使用されるまで、オブジェクトは初期化されません。

また、lazy()はデフォルトで同期処理(SYNCHRONIZEDモード)によりスレッドセーフに動作する点も覚えておくと良いでしょう。

コード例

次の例では、lazy変数「myName」を宣言しています。この部分のコードは最初の1回だけ実行され、値が初期化されるとアプリケーション全体でその値が記憶されます。lazy初期化によって一度代入された値は、再代入できません。

class Demo {
    val myName: String by lazy {
        println("Welcome to Lazy declaration")
        "www.tutorialspoint.com"
    }
}

fun main() {
    var obj = Demo()
    println(obj.myName)
    println("同じオブジェクトへの2回目のアクセス--" + obj.myName)
}

実行結果

上記のコードを実行すると、次の出力が得られます。

Welcome to Lazy declaration
www.tutorialspoint.com
同じオブジェクトへの2回目のアクセス--www.tutorialspoint.com

まとめ:lateinitとlazyの使い分け

  • lateinit:後から必ず初期化する可変(var)プロパティに向いています。依存性注入(DI)フレームワークなどでよく使われます。

  • lazy:初回アクセス時に自動的に初期化される不変(val)プロパティに向いています。初期化コストが高いオブジェクトの生成を、必要になるまで遅らせたい場合に有効です。

  1. CSSのz-indexプロパティの使い方をわかりやすく解説

    CSSのz-indexプロパティは、positionプロパティと組み合わせて使用することで、要素に重なり順(レイヤー)の効果を持たせることができます。どの要素を手前に表示し、どの要素を奥に配置するかを数値で指定できます。z-indexの基本ルール値が大きいほど手前に表示されます(例:z-index:3 の要素は z-index:1 の要素より上に重なります)。z-indexは、positionが relative、absolute、fixed、sticky のいずれかに設定された要素に対してのみ有効です。初期値は auto で、この場合はHTMLの記述順に従って重なります。サンプルコード以下の

  2. CSSのdisplayプロパティとは?各値の違いと使い方を実例付きで解説

    CSSのdisplayプロパティとは すべてのHTML要素には、CSSのdisplayプロパティにあらかじめデフォルト値が設定されています。このプロパティは、その要素がドキュメント内でどのように描画されるかを決定する重要な役割を持っています。 注意: デフォルトのdisplayプロパティは上書きすることができますが、これは要素そのものの種類が変わるわけではなく、ドキュメント上での表示の挙動が変化するだけである点に留意してください。 displayプロパティの主な値 displayプロパティにはさまざまな値を指定できますが、特によく使われる代表的な値は以下の4つです。 block(ブロック)