Middle
Када треба користити 'lateinit' и 'by lazy' у Kotlin-у?
sobes.tech АИ
Одговор од АИ
lateinit se koristi za non-nullable svojstva koja će kasnije biti inicijalizovana, pre prvog pristupa. Primjenjuje se sa var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Biće inicijalizovano u onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Sada se može koristiti binding
}
}
by lazy se koristi za non-nullable ili nullable svojstva, koja se inicijalizuju pri prvom pristupu. Primjenjuje se sa val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Poređenje:
| Osobina | lateinit |
by lazy |
|---|---|---|
| Upotreba | var |
val |
| Tip svojstva | Non-nullable | Non-nullable ili nullable |
| Inicijalizacija | Kasno, ručno | Pri prvom pristupu, automatski |
| Bezbednost niti | Nije garantovano podrazumevano (ako nije sinhronizovano ručno) | Garantovano podrazumevano (sinhronizovano) |
| Nulta vrednost | Nije dozvoljena pre inicijalizacije (baciće izuzetak) | Ne (tip je određen inicijalizatorom) |
Koristite lateinit kada vrednost svojstva zavisi od konteksta ili drugih faktora i mora biti postavljena nakon kreiranja objekta, ali pre njegove upotrebe (npr. kod povezivanja View u Android Activity).
Koristite by lazy za svojstva koja su skupa za kreiranje ili možda neće biti potrebna tokom celog životnog veka objekta, ili kada želite odložiti inicijalizaciju do prvog stvarnog korišćenja.