Sobes.tech
Middle

Kdy byste měli použít 'lateinit' a 'by lazy' v Kotlinu?

sobes.tech AI

Odpověď od AI

lateinit se používá pro nenulové vlastnosti, které budou později inicializovány, před prvním přístupem k nim. Používá se s var.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Bude inicializováno v onCreate

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Nyní lze používat binding
    }
}

by lazy se používá pro nenulové nebo nulové vlastnosti, které jsou inicializovány při prvním přístupu. Používá se s val.

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

Porovnání:

Vlastnost lateinit by lazy
Použití var val
Typ vlastnosti Nenulové Nenulové nebo nulové
Inicializace Pozdní, ručně Při prvním přístupu, automaticky
Bezpečnost vláken Není garantováno (je potřeba synchronizace ručně) Garantováno (synchronizováno)
Nulová hodnota Není povolena před inicializací (vyvolá výjimku) Ne (typ je určen inicializátorem)

Použijte lateinit, když hodnota vlastnosti závisí na kontextu nebo jiných faktorech a musí být nastavena po vytvoření objektu, ale před jejím použitím (například při vázání pohledů v Androidové aktivitě).

Použijte by lazy pro vlastnosti, které jsou nákladné na vytvoření nebo nemusí být potřeba po celou dobu života objektu, nebo když chcete odložit inicializaci do prvního skutečného použití.