Sobes.tech
Middle

Mikor kell használni a 'lateinit'-et és a 'by lazy'-t Kotlinban?

sobes.tech MI

Válasz az MI-től

A lateinit nem-null értékű tulajdonságokhoz használható, amelyek később, az első hozzáférés előtt lesznek inicializálva. var-ral alkalmazható.

class UserActivity : AppCompatActivity() {
    lateinit var binding: ActivityUserBinding // Az onCreate-ben lesz inicializálva

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        // Most már használható a binding
    }
}

A by lazy nem-null vagy null értékű tulajdonságokhoz használható, amelyek az első hozzáféréskor inicializálódnak. val-lal alkalmazható.

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

Összehasonlítás:

Jellemző lateinit by lazy
Alkalmazás var val
Tulajdonságtípus Nem-nullos Nem-nullos vagy null
Inicializálás Későn, kézzel Első hozzáféréskor, automatikusan
Szálbiztonság Nem garantált alapértelmezett (kézi szinkronizálás szükséges) Alapértelmezett garantált (szinkronizált)
Null érték Nem megengedett az inicializálás előtt (kivételt dob) Nem (a típus az inicializálótól függ)

Használja a lateinit-et, amikor a tulajdonság értéke a kontextustól vagy más tényezőktől függ, és az objektum létrehozása után, de használat előtt kell beállítani (például, View kötése Android Activity-ben).

Használja a by lazy-t olyan tulajdonságokhoz, amelyek költségesek a létrehozásban, vagy nem szükségesek az egész objektum életciklusa során, vagy amikor a inicializálást késleltetni szeretné az első tényleges használatig.