Middle
Koja je razlika između korišćenja ključne reči 'lateinit' i delegiranja pomoću 'by lazy {}' u Kotlinu?
sobes.tech АИ
Одговор од АИ
lateinit se koristi za odloženu inicijalizaciju promenljivih svojstava (var) koja ne mogu biti nullable i biće inicijalizovana kasnije, na primer u metodi životnog ciklusa aktivnosti ili fragmenta. Kompajler ne garantuje inicijalizaciju, a pristup neinicijalizovanom svojstvu izazvaće izuzetak UninitializedPropertyAccessException.
by lazy {} se koristi za odloženu inicijalizaciju nepromenljivih svojstava (val). Inicijalizacija se vrši pri prvom pristupu svojstvu, a rezultat se kešira. Ovo je podrazumevano bezbedno za niti i garantuje da će inicijalizator biti pozvan samo jednom.
| Osobina | lateinit |
by lazy {} |
|---|---|---|
| Primenjivo na | var |
val |
| Nullable | Ne nullable | Ne nullable |
| Garancija inicijalizacije | Ne (samo od programera) | Da (pri prvom pristupu) |
| Bezbednost niti | Nije garantovano po defaultu | Da (po defaultu) |
| Tip svojstva | Promenljivo | Nepromenljivo |
Primer sa 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 = "Zdravo, lateinit!"
}
}
Primer sa by lazy {}:
class MyViewModel : ViewModel() {
private val apiService: ApiService by lazy { provideApiService() } // Inicijalizuje se pri prvom korišćenju
private fun provideApiService(): ApiService {
// Logika za kreiranje ApiService
return ApiService()
}
fun fetchData() {
// apiService se inicijalizuje ovde pri prvom pozivu fetchData()
apiService.getData()
}
}