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ă.