Middle
Quando usare 'lateinit' e 'by lazy' in Kotlin?
sobes.tech AI
Risposta dell'AI
lateinit viene usato per proprietà non nullabili che saranno inizializzate più tardi, prima del primo accesso. Si applica con var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Verrà inizializzato in onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Ora si può usare binding
}
}
by lazy si usa per proprietà non nullabili o nullable, che vengono inizializzate al primo accesso. Si applica con val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Confronto:
| Caratteristica | lateinit |
by lazy |
|---|---|---|
| Applicazione | var |
val |
| Tipo di proprietà | Non nullable | Non nullable o nullable |
| Inizializzazione | Tardiva, manuale | Alla prima accesso, automaticamente |
| Sicurezza thread | Non garantito di default (se non sincronizzato manualmente) | Garantito di default (sincronizzato) |
| Valore nullo | Non consentito prima dell'inizializzazione (solleverà eccezione) | No (il tipo è determinato dall'inizializzatore) |
Usa lateinit quando il valore della proprietà dipende dal contesto o da altri fattori e deve essere impostato dopo la creazione dell'oggetto, ma prima del suo utilizzo (ad esempio, nel binding delle viste in un'Activity Android).
Usa by lazy per proprietà che sono costose da creare o che potrebbero non essere necessarie durante tutta la vita dell'oggetto, o quando si desidera posticipare l'inizializzazione fino al primo utilizzo effettivo.