Kotlin lateinit修飾子

概要

以下のように理解。
Nullを許容しないプロパティはコンストラクタで初期化しなければならないのだが、
依存性の注入を通して初期化される場合やユニットテストのsetUpメソッドのようなケースでは不便。
そこで、そのような場合にクラスのボディでプロパティを参照する際にnullチェックを回避することを可能としたもの。

構文

  • トップレベルのプロパティやローカル変数のように、クラスのボディで宣言される"var"プロパティで使用
  • プライマリコンストラクタではないこと
  • そのプロパティがカスタムゲッターやカスタムセッターを持っていないこと
  • プロパティや変数の型は非null ※プリミティブ型はNG

サンプルコード

internal class LateInitSampleTest {

    lateinit var testObject: TestObject
 //    testObject: TestObject

    @BeforeEach
    fun setUp() {
  // lateinit var がない場合はここでエラー"Unresolved reference: testObject"
        testObject = TestObject()  
    }

    @Test
    fun test() {
        // late init varないとエラー"Unresolved reference: testObject"
        assertEquals("lateinit sample!", testObject.getMessage())
    }

    // .isInitializedで lateinit var が初期化済みかどうか確認できる
    @Test
    fun test_isInitialized() {
        assertTrue(this::testObject.isInitialized)
    }
}

class TestObject {
    fun getMessage(): String {
        return "lateinit sample!"
    }
}

参考