Sobes.tech
Middle

Када треба користити 'lateinit' и 'by lazy' у Kotlin-у?

sobes.tech АИ

Одговор од АИ

lateinit se koristi za non-nullable svojstva koja će kasnije biti inicijalizovana, pre prvog pristupa. Primjenjuje se sa var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Biće inicijalizovano u onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Sada se može koristiti binding
    }
}

by lazy se koristi za non-nullable ili nullable svojstva, koja se inicijalizuju pri prvom pristupu. Primjenjuje se sa val.

class DataManager {
    val apiService: ApiService by lazy {
        Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ApiService::class.java)
    }
}

Poređenje:

Osobina lateinit by lazy
Upotreba var val
Tip svojstva Non-nullable Non-nullable ili nullable
Inicijalizacija Kasno, ručno Pri prvom pristupu, automatski
Bezbednost niti Nije garantovano podrazumevano (ako nije sinhronizovano ručno) Garantovano podrazumevano (sinhronizovano)
Nulta vrednost Nije dozvoljena pre inicijalizacije (baciće izuzetak) Ne (tip je određen inicijalizatorom)

Koristite lateinit kada vrednost svojstva zavisi od konteksta ili drugih faktora i mora biti postavljena nakon kreiranja objekta, ali pre njegove upotrebe (npr. kod povezivanja View u Android Activity).

Koristite by lazy za svojstva koja su skupa za kreiranje ili možda neće biti potrebna tokom celog životnog veka objekta, ili kada želite odložiti inicijalizaciju do prvog stvarnog korišćenja.