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