Middle
Kiedy należy używać 'lateinit' i 'by lazy' w Kotlin?
sobes.tech AI
Odpowiedź od AI
lateinit jest używany dla właściwości nie-nullowalnych, które będą inicjalizowane później, przed pierwszym dostępem do nich. Stosuje się go z var.
class UserActivity : AppCompatActivity() {
lateinit var binding: ActivityUserBinding // Będzie zainicjalizowane w onCreate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
// Teraz można używać binding
}
}
by lazy jest używany dla właściwości nie-nullowalnych lub nullable, które są inicjalizowane przy pierwszym dostępie. Stosuje się go z val.
class DataManager {
val apiService: ApiService by lazy {
Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
Porównanie:
| Cecha | lateinit |
by lazy |
|---|---|---|
| Zastosowanie | var |
val |
| Typ właściwości | Nie-nullowalny | Nie-nullowalny lub nullable |
| Inicjalizacja | Późna, ręczna | Przy pierwszym dostępie, automatyczna |
| Bezpieczeństwo wątków | Nie gwarantowane domyślnie (jeśli nie zsynchronizowane ręcznie) | Gwarantowane domyślnie (zsynchronizowane) |
| Wartość null | Niedozwolona przed inicjalizacją (wyrzuci wyjątek) | Nie (typ określa inicjalizator) |
Używaj lateinit, gdy wartość właściwości zależy od kontekstu lub innych czynników i musi być ustawiona po utworzeniu obiektu, ale przed jego użyciem (np. podczas wiązania widoków w Android Activity).
Używaj by lazy dla właściwości, które są kosztowne w tworzeniu lub mogą nie być potrzebne przez cały czas życia obiektu, lub gdy chcesz opóźnić inicjalizację do momentu pierwszego faktycznego użycia.