2016-02-29 22 views
12

In Kotlin sembra esserci un metodo per dichiarare una variabile all'interno di un oggetto che può essere nullo e istanziato dopo la creazione dell'oggetto.Kotlin - lateinit VS Any? = null

var myObject : Any? = null 

o

var lateinit myObject : Any 

Sono confuso sul perché è necessaria la parola lateinit se possiamo solo fare il var annullabile e assegnare un secondo momento. Quali sono i pro e i contro di ciascun metodo e in quale situazione dovrebbero essere utilizzati?

risposta

13

Ecco come vedo la differenza secondo le mie attuali conoscenze in Kotlin.

Primo uno:

var myObject1 : Any? = null 

Qui myObject1 è una proprietà che è annullabile. Ciò significa che è possibile assegnare null ad esso.

secondo:

lateinit var myObject2 : Any 

Qui myObject2 è una struttura non nullo. Ciò significa che non è possibile assegnare null ad esso. Di solito se una proprietà è non nullo devi inizializzarla alla dichiarazione. Ma aggiungendo la parola chiave lateinit è possibile posticipare l'inizializzazione. Se si tenta di accedere alla proprietà lateinit prima di inizializzarla, si ottiene un'eccezione.

In breve la differenza principale è che myObject1 è un valore nullo e myObject2 è un valore non nullo. La parola chiave lateinit fornisce un meccanismo di convenienza per consentire l'inizializzazione di una proprietà non nullo in un momento successivo anziché inizializzarla nella dichiarazione.

Per ulteriori informazioni, verificare this.

4

lateinit parola chiave viene utilizzato su un campo per avoid assegni null quando si fa riferimento al campo all'interno del proprio oggetto. La parola chiave viene utilizzata principalmente quando si utilizza l'iniezione di dipendenza per inizializzare la variabile o l'inizializzazione della variabile nel metodo di installazione di un test di unità

? viene utilizzato su un campo quando il campo verrà inizializzato successivamente nel programma o da un setter o all'interno di un metodo dell'oggetto, questo è quello di far rispettare per null o utilizzare la sicurezza null (?.) quando si fa riferimento al campo

1

Se la vostra proprietà non deve essere null, ma non è impostato dopo un certo punto in futuro, è più sicuro dichiararlo con una parola chiave lateinit. Ciò garantisce che, se accedete prima che sia impostato, ottieni un'eccezione che spiega esattamente questo.

Il modo tradizionale Java è di generare un generico NullPointerException senza alcuna spiegazione. Se hai scritto il codice tu stesso, potresti avere un indizio, ma se qualcun altro rileva l'errore, non sarà chiaro perché quella variabile particolare è null.