2016-02-29 15 views
12

Kotlinには、オブジェクトの内部に変数を宣言する方法が2つあり、オブジェクトを作成した後にnullにしてインスタンス化することができます。Kotlin - lateinit VS Any Any? = null

var myObject : Any? = null 

または

var lateinit myObject : Any 

私たちはただのvar NULL可能を作成し、後でそれを割り当てることができるかどうlateinitキーワードが必要な理由について混乱しています。それぞれの方法の長所と短所は何か、それぞれの状況をどのように使うべきか?

答えて

13

ここで私はコトルの私の現在の知識に応じて違いを見ています。

まず1:

var myObject1 : Any? = null 

ここmyObject1はNULL可能であるプロパティです。つまり、nullを割り当てることができます。

第二1:

lateinit var myObject2 : Any 

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

主な違いは、myObject1はnullableであり、myObject2はnullではないという点です。キーワードlateinitは、null以外のプロパティを宣言で初期化するのではなく、後で初期化できるようにする便利なメカニズムを提供します。詳細情報については

thisをご確認ください。

4

lateinitキーワードはフィールドに使用され、avoidには、オブジェクト内のフィールドを参照するときにNULLがチェックされます。キーワードは主に依存関係注入を使用して変数を初期化するとき、またはユニットテストの設定メソッドで変数を初期化するときに使用されます。

?フィールドは、プログラムの後でフィールドが初期化されるときに使用されます。オブジェクトのメソッドのセッターまたは内部では、このフィールド

1

を参照するときにあなたの財産はnullをすべきではない場合はnullをチェックまたはnull安全性(?.)を使用することができ強制することですが、直後に設定されていません将来的にはlateinitというキーワードで宣言する方が安全です。これは、設定される前にアクセスすると、それを正確に説明する例外が発生することを保証します。

従来のJavaの方法は、それについての説明なしで一般的なNullPointerExceptionを投げることです。あなたは、コードを自分で書いた場合、あなたは手掛かりを持っているかもしれませんが、他の誰かがエラーをキャッチした場合、それは特定の変数がnullあるなぜは明らかではありません。