Sobes.tech
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.