Sobes.tech
Junior

Objasnite kako funkcioni svojstvo 'lateinit' u Kotlinu.

sobes.tech АИ

Одговор од АИ

lateinit se koristi za deklarisanje svojstava koja nisu nullable i biće inicijalizovana kasnije, pre prvog pristupa.

  • Primjenjuje se samo na promenljive (var).
  • Ne može se koristiti sa primitivnim tipovima podataka (kao što su Int, Boolean, Float), jer oni ne mogu biti null.
  • Kompajler ne zahteva trenutnu inicijalizaciju svojstva pri njegovom deklarisanju.
  • Ako se svojstvo koristi pre inicijalizacije, biće bačen izuzetak UninitializedPropertyAccessException.

Primer:

class MyClass {
    lateinit var myProperty: String // Svojstvo će biti inicijalizovano kasnije

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

    fun useProperty() {
        println(myProperty) // Sigurno nakon inicijalizacije
    }
}

fun main() {
    val obj = MyClass()
    // obj.useProperty() // Ovde će biti bačen `UninitializedPropertyAccessException`
    obj.initializeProperty("Hello")
    obj.useProperty() // Ispisaće "Hello"

    // Provera da li je inicijalizovano
    if (obj::myProperty.isInitialized) {
        println("Svojstvo je inicijalizovano")
    }
}

Možete proveriti da li je lateinit svojstvo inicijalizovano pomoću refleksije: ::propertyName.isInitialized.

Upotreba lateinit je česta u framework-ovima gde se svojstva injektuju (dependency injection) nakon kreiranja objekta (npr. u Androidu sa UI elementima ili injekcijom zavisnosti).