Middle
Kāda ir atšķirība starp 'lateinit' atslēgvārda izmantošanu un deleģēšanu ar 'by lazy {}' Kotlin?
sobes.tech AI
Atbilde no AI
lateinit tiek izmantots atliktai inicializācijai mainīgajām īpašībām (var), kuras nevar būt nullable un kuras tiks inicializētas vēlāk, piemēram, aktivitātes vai fragmenta dzīves cikla metodē. Kompilators neparedz inicializāciju, un piekļuve ne-inicializētai īpašībai izraisīs UninitializedPropertyAccessException kļūdu:
by lazy {} tiek izmantots atliktai un nemainīgai īpašībai (val) inicializācijai. Inicializācija notiek pirmreizējās piekļuves laikā, un rezultāts tiek kešots. Tas ir droši sēriju kontekstā un garantē, ka inicializators tiks izsaukts tikai vienu reizi.
| Zīme | lateinit |
by lazy {} |
|---|---|---|
| Piemērots tam | var |
val |
| Nullable | Nav nullable | Nav nullable |
| Inicializācijas garantija | Nav (tikai izstrādātāja) | Jā (pirmreizējās piekļuves laikā) |
| Sēriju drošība | Nav garantēta pēc noklusējuma | Jā (pēc noklusējuma) |
| Īpašības tips | Maināms | Nemainīgs |
Piemērs ar 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 = "Hello, lateinit!"
}
}
Piemērs ar by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Inicializējas pirmās lietošanas laikā
private fun provideApiService(): ApiService {
// ApiService izveides loģika
return ApiService()
}
fun fetchData() {
// apiService tiek inicializēts šeit pirmās izsaukšanas laikā fetchData()
apiService.getData()
}
}