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.