Middle
Aký je rozdiel medzi používaním kľúčového slova 'lateinit' a delegovaním pomocou 'by lazy {}' v Kotlin?
sobes.tech AI
Odpoveď od AI
lateinit sa používa na oneskorenú inicializáciu meniteľných vlastností (var), ktoré nemôžu byť nullable a budú neskôr inicializované, napríklad v metóde životného cyklu aktivity alebo fragmentu. Kompilátor nezaručuje inicializáciu a prístup k neinicializovanej vlastnosti spôsobí výnimku UninitializedPropertyAccessException.
by lazy {} sa používa na oneskorenú inicializáciu nemenných vlastností (val). Inicializácia sa vykoná pri prvom prístupe k vlastnosti a výsledok sa cache-uje. Toto je predvolene bezpečné pre vlákna a garantuje, že inicializátor bude volaný iba raz.
| Vlastnosť | lateinit |
by lazy {} |
|---|---|---|
| Použiteľné na | var |
val |
| Nullable | Nie nullable | Nie nullable |
| Záruka inicializácie | Nie (len vývojárom) | Áno (pri prvom prístupe) |
| Bezpečnosť vlákien | Nie garantované podľa predvolenej hodnoty | Áno (podľa predvolenej hodnoty) |
| Typ vlastnosti | Menná | Nemenná |
Príklad s lateinit:
class MyActivity : AppCompatActivity() {
private lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView = findViewById(R.id.my_text_view)
textView.text = "Ahoj, lateinit!"
}
}
Príklad s by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Inicializuje sa pri prvom použití
private fun provideApiService(): ApiService {
// Logika na vytvorenie ApiService
return ApiService()
}
fun fetchData() {
// apiService je inicializovaný tu pri prvom volaní fetchData()
apiService.getData()
}
}