Sobes.tech
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()
    }
}