web-dev-qa-db-ja.com

Kotlin-lateinit VS Any? = null

Kotlinでは、オブジェクト内で変数を宣言する2つの方法があり、オブジェクトの作成後にnullおよびインスタンス化することができます。

var myObject : Any? = null

または

var lateinit myObject : Any  

Varをnull許容にして後で割り当てることができるのに、なぜlateinitキーワードが必要なのか混乱しています。それぞれの方法の長所と短所は何ですか?また、それぞれをどのような状況で使用する必要がありますか?

19
fergdev

これが、Kotlinでの現在の知識による違いの見方です。

最初の1つ:

var myObject1 : Any? = null

ここに myObject1はnull許容のプロパティです。つまり、nullを割り当てることができます。

二つ目:

lateinit var myObject2 : Any

ここに myObject2はnull以外のプロパティです。つまり、nullを割り当てることはできません。通常、プロパティがnull以外の場合は、宣言時に初期化する必要があります。ただし、キーワードlateinitを追加すると、初期化を延期できます。初期化する前にlateinitプロパティにアクセスしようとすると、例外が発生します。

要するに、主な違いはmyObject1はnull許容型であり、myObject2はnullではありません。キーワードlateinitは、null以外のプロパティを宣言時に初期化するのではなく、後で初期化できるようにする便利なメカニズムを提供します。

詳細については、 this を確認してください。

20
dishan

lateinitキーワードは、オブジェクト内のフィールドを参照するときにavoidnullチェックを行うためにフィールドで使用されます。このキーワードは主に、依存性注入を使用して変数を初期化する場合、または単体テストのセットアップメソッドで変数を初期化する場合に使用されます。

?は、プログラムの後半でセッターまたはオブジェクトのメソッド内のいずれかによってフィールドが初期化されるときにフィールドで使用されます。これは、nullをチェックするか、nullの安全性を使用するように強制するためです(?.)フィールドを参照する場合

5
Kevin Crain

プロパティをnullにするべきではないが、将来のある時点以降に設定されない場合は、lateinitキーワードを使用して宣言する方が安全です。これにより、設定する前にアクセスすると、それを正確に説明する例外が発生することが保証されます。

従来のJavaの方法は、説明なしで一般的なNullPointerExceptionをスローすることです。自分でコードを書いた場合は手がかりがあるかもしれませんが、誰かがエラーを見つけた場合、それは明確ではありませんなぜその特定の変数はnullです。

1
Dielson Sales