Kotlinは型安全性を重視し、nullポインタの回避を目指していますが、依存性注入やAndroid Activityの使用時など、変数の遅延初期化が必要となる場合がよくあります。そのため、lateinit修飾子が追加されました。
通常のプロパティは必ず初期化する必要があるか、nullableでなければならず、遅延ながら必ず初期化が保証される場合には不便です。nullable型を使用するとコードが複雑になり、追加のnullチェックが必要になります。
lateinitを使用すると、初期化されていないプロパティを作成できますが、それを最初に使用する前に初期化することをコンパイラに約束します。コンストラクタではなく、後で初期化することも可能です。
class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }
主な特徴:
valプロパティにlateinitを使用できますか?
いいえ。lateinitはvarでのみ機能します。valは一度即座に初期化されるか、ゲッターを介して初期化される必要があります。
lateinitはInt、Boolean、Doubleなどのprimitiveタイプで機能しますか?
いいえ。オブジェクト参照型でのみ機能します。primitiveにはnullable型を使用してください。
初期化前にlateinitプロパティにアクセスした場合はどうなりますか?
KotlinはUninitializedPropertyAccessExceptionをスローします:
lateinit var foo: String println(foo) // 例外
開発者がlateinit var item: Stringを宣言し、getItemメソッドを呼び出すまで初期化しなかった。結果:アプリケーションがクラッシュしました。
メリット:
デメリット:
Android Activity:lateinit var presenter、onCreateで初期化。すべてのライフサイクルメソッドでpresenterを使用することが安全です:nullabilityは必要ありません。
メリット:
デメリット: