Kotlinでは、コンストラクター内またはクラス本体の上部でクラスプロパティを初期化しない場合、基本的に次の2つのオプションがあります(言語参照から)。
lazy()はラムダを取り、レイジープロパティを実装するためのデリゲートとして機能するLazyのインスタンスを返す関数です。最初のget()の呼び出しは、lazy()に渡されたラムダを実行し、結果を記憶します。 get()は単に記憶された結果を返します。
例
public class Hello { val myLazyString: String by lazy { "Hello" } }
最初の呼び出しとsubquential呼び出しがだから、それはどこにmyLazyString戻ります「こんにちは」
通常、null以外の型として宣言されたプロパティは、コンストラクターで初期化する必要があります。ただし、これは不便なことがよくあります。たとえば、プロパティは、依存関係の注入、または単体テストのセットアップメソッドで初期化できます。この場合、コンストラクターでnull以外の初期化子を指定することはできませんが、クラスの本体内のプロパティを参照するときにnullチェックを回避する必要があります。
この場合に対処するには、lateinit修飾子を使用してプロパティをマークします。
public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } }
修飾子は、クラスの本体内で宣言された(プライマリコンストラクターではなく)varプロパティでのみ使用でき、プロパティにカスタムゲッターまたはセッターがない場合にのみ使用できます。プロパティのタイプはnull以外である必要があり、プリミティブタイプであってはなりません。
では、これらの2つのオプションはどちらも同じ問題を解決できるので、これらのオプションを正しく選択するにはどうすればよいでしょうか。
lateinit
、セッターの可視性でバッキングフィールドが公開されるため、KotlinとJavaからプロパティにアクセスする方法が異なります。また、Javaコードから、このプロパティはnull
Kotlinでのチェックなしでも設定できます。したがってlateinit
、遅延初期化ではなく、必ずしもKotlinコードからの初期化ではありません。