Kotlinでは、オブジェクト内で変数を宣言する2つの方法があり、オブジェクトの作成後にnullおよびインスタンス化することができます。
var myObject : Any? = null
または
var lateinit myObject : Any
Varをnull許容にして後で割り当てることができるのに、なぜlateinitキーワードが必要なのか混乱しています。それぞれの方法の長所と短所は何ですか?また、それぞれをどのような状況で使用する必要がありますか?
これが、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 を確認してください。
lateinit
キーワードは、オブジェクト内のフィールドを参照するときにavoid
nullチェックを行うためにフィールドで使用されます。このキーワードは主に、依存性注入を使用して変数を初期化する場合、または単体テストのセットアップメソッドで変数を初期化する場合に使用されます。
?
は、プログラムの後半でセッターまたはオブジェクトのメソッド内のいずれかによってフィールドが初期化されるときにフィールドで使用されます。これは、nullをチェックするか、nullの安全性を使用するように強制するためです(?.
)フィールドを参照する場合
プロパティをnull
にするべきではないが、将来のある時点以降に設定されない場合は、lateinit
キーワードを使用して宣言する方が安全です。これにより、設定する前にアクセスすると、それを正確に説明する例外が発生することが保証されます。
従来のJavaの方法は、説明なしで一般的なNullPointerException
をスローすることです。自分でコードを書いた場合は手がかりがあるかもしれませんが、誰かがエラーを見つけた場合、それは明確ではありませんなぜその特定の変数はnull
です。