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