Sobes.tech
Middle

Mi a különbség a 'lateinit' kulcsszó használata és a 'by lazy {}' delegálás között Kotlinban?

sobes.tech MI

Válasz az MI-től

A lateinit a módosítható tulajdonságok (var) késleltetett inicializálására szolgál, amelyek nem lehetnek null értékűek, és később, például egy aktivitás vagy fragment életciklus metódusában inicializálódnak. A fordító nem garantálja az inicializálást, és a nem inicializált tulajdonsághoz való hozzáférés UninitializedPropertyAccessException kivételt okoz.

A by lazy {} a nem módosítható tulajdonságok (val) késleltetett inicializálására szolgál. Az inicializálás az első hozzáféréskor történik, és az eredmény cache-be kerül. Ez alapértelmezés szerint szálbiztos, és garantálja, hogy az inicializáló csak egyszer hívódik meg.

Jellemző lateinit by lazy {}
Alkalmazható var val
Null érték Nem null értékű Nem null értékű
Inicializálási garancia Nem (csak a fejlesztő által) Igen (első hozzáféréskor)
Szálbiztonság Nem garantált alapértelmezés szerint Igen (alapértelmezett)
Tulajdonságtípus Módosítható Nem módosítható

Példa lateinit-tel:

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 = "Helló, lateinit!"
    }
}

Példa by lazy {}-vel:

class MyViewModel : ViewModel() {

    private val apiService: ApiService by lazy { provideApiService() } // Első használatkor inicializálódik

    private fun provideApiService(): ApiService {
        // ApiService létrehozási logika
        return ApiService()
    }

    fun fetchData() {
        // apiService itt inicializálódik az első fetchData() híváskor
        apiService.getData()
    }
}