Sobes.tech
Junior

Vysvětlete, jak funguje vlastnost 'lateinit' v Kotlinu.

sobes.tech AI

Odpověď od AI

lateinit se používá k deklaraci ne-nullovatelného vlastnosti, která bude později inicializována, před prvním přístupem k ní.

  • Používá se pouze u měnitelných vlastností (var).
  • Nelze jej použít s primitivními datovými typy (například Int, Boolean, Float), protože ty nemohou být null.
  • Kompilátor nevyžaduje okamžitou inicializaci vlastnosti při jejím deklarování.
  • Pokud je vlastnost použita před inicializací, bude vyhozena výjimka UninitializedPropertyAccessException.

Příklad:

class MyClass {
    lateinit var myProperty: String // Vlastnost bude později inicializována

    fun initializeProperty(value: String) {
        myProperty = value
    }

    fun useProperty() {
        println(myProperty) // Bezpečné po inicializaci
    }
}

fun main() {
    val obj = MyClass()
    // obj.useProperty() // Zde dojde k vyhození `UninitializedPropertyAccessException`
    obj.initializeProperty("Hello")
    obj.useProperty() // Vypíše "Hello"

    // Kontrola, zda je vlastnost inicializována
    if (obj::myProperty.isInitialized) {
        println("Vlastnost je inicializována")
    }
}

Lze zkontrolovat, zda vlastnost lateinit byla inicializována, pomocí reflexe: ::propertyName.isInitialized.

Použití lateinit je běžné ve frameworkách, kde jsou vlastnosti injektovány (dependency injection) po vytvoření objektu (například v Androidu s UI prvky nebo injekcí závislostí).