Sobes.tech
Middle

Kedy by ste mali použiť 'lateinit' a 'by lazy' v Kotlin?

sobes.tech AI

Odpoveď od AI

lateinit saťahuje pre nenulových vlastností, ktoré budú neskôr inicializované, pred prvým prístupom k nim. Používa sa s var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Bude inicializované v onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Teraz je možné použiť binding
    }
}

by lazy sa používa pre nenulové alebo nulové vlastnosti, ktoré sú inicializované pri prvom prístupe. Používa sa s val.

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

Porovnanie:

Vlastnosť lateinit by lazy
Použitie var val
Typ vlastnosti Non-nullable Non-nullable alebo nullable
Inicializácia Neskoro, manuálne Pri prvom prístupe, automaticky
Bezpečnosť vlákien Nie je garantované (ak nie je synchronizované manuálne) Garantované (synchronizované)
Nulová hodnota Nie je povolená pred inicializáciou (vyhodí výnimku) Nie (typ je určený inicializátorom)

Použite lateinit, keď hodnota vlastnosti závisí od kontextu alebo iných faktorov a musí byť nastavená po vytvorení objektu, ale pred jej použitím (napríklad pri viazaní View v Android Activity).

Použite by lazy pre vlastnosti, ktoré sú nákladné na vytvorenie alebo nemusia byť potrebné počas celého života objektu, alebo keď chcete odložiť inicializáciu do prvého skutočného použitia.