Middle
Czym są 'lazy' i 'lateinit' w Kotlin?
sobes.tech AI
Odpowiedź od AI
lazy - delegat właściwości do opóźnionej inicjalizacji właściwości niezmiennych (val). Wartość jest obliczana przy pierwszym odwołaniu się do właściwości, a następnie buforowana.
// Przykład użycia lazy
val lazyValue: String by lazy {
println("Inicjalizacja") // wyświetli się tylko raz przy pierwszym odwołaniu
"Cześć, lazy!"
}
lateinit - modyfikator dla właściwości zmiennych (var), który pozwala opóźnić inicjalizację do momentu pierwszego dostępu. Właściwość musi być nie-nullowalna. Użycie właściwości przed inicjalizacją powoduje UninitializedPropertyAccessException.
// Przykład użycia lateinit
lateinit var lateinitVariable: String
fun initializeVariable() {
lateinitVariable = "Cześć, lateinit!"
}
fun useVariable() {
// Sprawdzenie inicjalizacji przed użyciem (opcjonalnie, ale zalecane)
if (::lateinitVariable.isInitialized) {
println(lateinitVariable)
} else {
println("Zmienna jeszcze nie zainicjalizowana")
}
}
Główne różnice:
| Cecha | lazy |
lateinit |
|---|---|---|
| Typ właściwości | val (tylko do odczytu) |
var (zmienny) |
| Nullowalność | Może być nullable lub non-nullable | Musi być non-nullable |
| Inicjalizacja | Automatyczna, przy pierwszym odwołaniu | Ręczna |
| Opóźnienie inicjalizacji | Tak, przy pierwszym odwołaniu | Tak, deklaracja bez inicjalizacji |
| Bezpieczeństwo wątków | Domyślnie bezpieczne wątkowo (synchronizacja), dostępne opcje | Nie gwarantowane, zależy od kontekstu |
| Wyjątek przy dostępie przed inicjalizacją | Nie, inicjalizuje się automatycznie | UninitializedPropertyAccessException |