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()
}
}