Middle
Jaký je rozdíl mezi použitím klíčového slova 'lateinit' a delegováním pomocí 'by lazy {}' v Kotlinu?
sobes.tech AI
Odpověď od AI
lateinit se používá pro odloženou inicializaci měnitelných vlastností (var), které nemohou být nullable a budou inicializovány později, například v metodě životního cyklu aktivity nebo fragmentu. Kompilátor nezaručuje inicializaci a přístup k neinicializované vlastnosti způsobí výjimku UninitializedPropertyAccessException.
by lazy {} se používá pro odloženou inicializaci neměnitelných vlastností (val). Inicializace se provádí při prvním přístupu k vlastnosti a výsledek se ukládá do cache. To je ve výchozím nastavení bezpečné pro vlákna a zaručuje, že inicializátor bude volán pouze jednou.
| Vlastnost | lateinit |
by lazy {} |
|---|---|---|
| Použitelné na | var |
val |
| Nullable | Ne nullable | Ne nullable |
| Záruka inicializace | Ne (pouze vývojářem) | Ano (při prvním přístupu) |
| Bezpečnost vláken | Není garantováno ve výchozím nastavení | Ano (ve výchozím nastavení) |
| Typ vlastnosti | Měnitelné | Neměnitelné |
Pří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!"
}
}
Příklad s by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Inicializace při prvním použití
private fun provideApiService(): ApiService {
// Logika tvorby ApiService
return ApiService()
}
fun fetchData() {
// apiService je inicializováno zde při prvním volání fetchData()
apiService.getData()
}
}