Middle
Kada naudoti 'lateinit' ir 'by lazy' Kotlin?
sobes.tech AI
Atsakymas iš AI
lateinit naudojamas non-nullable savybėms, kurios bus vėliau inicializuotos, prieš pirmąjį jų naudojimą. Naudojama su var.
klasė UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Bus inicializuota onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Dabar galima naudoti binding
}
}
by lazy naudojamas non-nullable arba nullable savybėms, kurios inicializuojamos pirmo pasiekimo metu. Naudojama su val.
klasė DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Palyginimas:
| Bruožas | lateinit |
by lazy |
|---|---|---|
| Naudojimas | var |
val |
| Savybės tipas | Non-nullable | Non-nullable arba nullable |
| Inicializacija | Vėliau, rankiniu būdu | Pirmo pasiekimo metu, automatiškai |
| Srauto saugumas | Ne garantuojama (jei nėra sinchronizuota rankiniu būdu) | Garantijuojama automatiškai (sinchronizuota) |
| Nulinė reikšmė | Neleidžiama iki inicializacijos (mestų išimtį) | Nėra (tipas nustatomas inicializatoriumi) |
Naudokite lateinit, kai savybės reikšmė priklauso nuo konteksto ar kitų veiksnių ir turi būti nustatyta po objekto sukūrimo, bet prieš naudojimą (pavyzdžiui, Android Activity, kai pririšate View).
Naudokite by lazy savybėms, kurios yra brangios kurti arba gali būti nereikalingos viso objekto gyvavimo metu, arba kai norite atidėti inicializaciją iki pirmojo faktiško naudojimo.