Sobes.tech
Middle

Când ar trebui să folosiți 'lateinit' și 'by lazy' în Kotlin?

sobes.tech AI

Răspuns de la AI

lateinit este folosit pentru proprietăți non-nullable care vor fi inițializate mai târziu, înainte de prima accesare a lor. Se aplică cu var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Va fi inițializat în onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Acum se poate folosi binding
    }
}

by lazy se folosește pentru proprietăți non-nullable sau nullable, care sunt inițializate la primul acces. Se aplică cu val.

class DataManager {
    val apiService: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Comparație:

Caracteristică lateinit by lazy
Aplicație var val
Tipul proprietății Non-nullable Non-nullable sau nullable
Inițializare Ulterior, manual La primul acces, automat
Siguranța thread-urilor Nu garantată implicit (dacă nu este sincronizată manual) Garantată implicit (sincronizată)
Valoare nulă Nu este permis înainte de inițializare (va arunca excepție) Nu (tipul este determinat de inițializator)

Utilizați lateinit când valoarea proprietății depinde de context sau alți factori și trebuie stabilită după crearea obiectului, dar înainte de utilizare (de exemplu, la legarea vizualizărilor într-o activitate Android).

Utilizați by lazy pentru proprietăți costisitoare de creare sau care poate nu vor fi necesare pe toată durata de viață a obiectului, sau când doriți să amânați inițializarea până la primul utilizare efectivă.