Kotlin si concentra sulla sicurezza dei tipi ed evita i puntatori null, ma spesso si presenta la necessità di inizializzare le variabili in modo ritardato (late), ad esempio, quando si utilizza l'iniezione delle dipendenze o in Android Activity. Per questo è stato aggiunto il modificatore lateinit.
Le proprietà normali richiedono un'inizializzazione obbligatoria o devono essere nullable, il che è scomodo se si garantisce un'inizializzazione obbligatoria successiva. L'uso del tipo nullable complica il codice e richiede controlli null aggiuntivi.
lateinit consente di creare una proprietà non inizializzata fino a un certo punto, ma promette al compilatore che sarà inizializzata prima del primo utilizzo. Può essere inizializzata non nel costruttore, ma più tardi.
class UserViewModel { lateinit var repository: UserRepository fun onCreate() { repository = UserRepository() } fun getData() = repository.load() }
Caratteristiche principali:
È possibile utilizzare lateinit per proprietà val?
No. lateinit funziona solo con var, poiché val deve essere inizializzato una volta immediatamente o tramite un getter.
Funziona lateinit con tipi Int, Boolean, Double e altri primitivi?
No. Solo con tipi di riferimento degli oggetti. Per i primitivi utilizzare tipi nullable.
Cosa succede se si accede a una proprietà lateinit prima dell'inizializzazione?
Kotlin genera UninitializedPropertyAccessException:
lateinit var foo: String println(foo) // Eccezione
Un sviluppatore ha dichiarato lateinit var item: String, non l'ha inizializzato prima della prima chiamata al metodo getItem. Risultato: arresto dell'applicazione.
Pro:
Contro:
Android Activity: lateinit var presenter, inizializzazione in onCreate. L'uso di presenter in tutti i metodi di ciclo di vita è sicuro: la nullability non è necessaria.
Pro:
Contro: