Sobes.tech
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