lateinit und verzögerte Initialisierung
Verwenden Sie lateinit für später zugewiesene Properties und by lazy für verzögerte Berechnungen.
lateinit und verzögerte Initialisierung ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Werkzeuge für die verzögerte Initialisierung
Manchmal können Sie eine Eigenschaft zum Zeitpunkt der Konstruktion nicht initialisieren. Kotlin bietet dafür lateinit (für var, das später zugewiesen wird) und by lazy (für val, das beim ersten Zugriff berechnet wird).
Grundlagen zu lateinit
lateinit var verschiebt die Initialisierung. Die Variable muss ein nicht nullfähiges, nicht primitives var sein. Ein Zugriff vor der Zuweisung löst UninitializedPropertyAccessException aus.
class Service {
lateinit var name: String
fun init(value: String) { name = value }
}
fun main() {
val s = Service()
s.init("MyService")
println(s.name)
}Warum lateinit verwenden?
Verwenden Sie lateinit für Dependency Injection, Test-Fixtures oder von Frameworks verwaltete Lebenszyklen (Android-Views, Spring-Beans), bei denen die Initialisierung außerhalb des Konstruktors erfolgt.
class Repository {
lateinit var db: String // assigned later by DI framework
fun query() = "querying $db"
}
fun main() {
val r = Repository()
r.db = "postgres://localhost"
println(r.query())
}isInitialized-Prüfung
Sie können prüfen, ob einer lateinit-Eigenschaft ein Wert zugewiesen wurde, indem Sie ::propName.isInitialized verwenden.
class Foo {
lateinit var bar: String
fun status() = if (::bar.isInitialized) "set to $bar" else "unset"
}
fun main() {
val f = Foo()
println(f.status()) // unset
f.bar = "hi"
println(f.status())
}Einschränkungen von lateinit
Sie können lateinit nicht für primitive Typen (Int, Boolean usw.), nullable Typen oder val verwenden. Der Compiler erzwingt diese Regeln.
// VALID:
lateinit var name: String
// INVALID:
// lateinit var count: Int // primitives not allowed
// lateinit val constant: String // val not allowed
// lateinit var maybe: String? // nullable not allowed
fun main() { name = "ok"; println(name) }Grundlagen zu by lazy
by lazy verschiebt die Initialisierung eines val, bis erstmals darauf zugegriffen wird. Die Lambda-Funktion wird einmal ausgeführt und das Ergebnis zwischengespeichert.
val expensive: String by lazy {
println("Computing...")
"result"
}
fun main() {
println(expensive) // Computing... then result
println(expensive) // result (cached)
}Warum by lazy verwenden?
Verwenden Sie by lazy, wenn die Initialisierung aufwendig ist und möglicherweise nicht benötigt wird (sodass sie für eine spätere Verwendung zwischengespeichert wird) oder wenn sie von anderen, bereits erstellten Eigenschaften abhängt.
class Config {
val parsed: Map<String, String> by lazy {
println("parsing config...")
mapOf("host" to "localhost", "port" to "8080")
}
}
fun main() {
val c = Config()
println("config object created — not parsed yet")
println(c.parsed["host"]) // now parses
println(c.parsed["port"]) // cached
}Thread-Sicherheitsmodi von lazy
Standardmäßig verwendet by lazy LazyThreadSafetyMode.SYNCHRONIZED. Verwenden Sie PUBLICATION für eine Initialisierung, bei der konkurrierende Zugriffe unproblematisch sind, und NONE für bessere Leistung bei einer Ausführung in nur einem Thread.
val safe: String by lazy { "thread-safe" }
val fast: String by lazy(LazyThreadSafetyMode.NONE) { "fast, single-thread" }
fun main() {
println(safe)
println(fast)
}lateinit vs lazy
var, das extern zugewiesen wird. by lazy: val, das beim ersten Zugriff von der Eigenschaft selbst berechnet wird.class Demo {
lateinit var injected: String // assigned by caller
val computed: String by lazy { "computed once" }
}
fun main() {
val d = Demo()
d.injected = "from outside"
println(d.injected)
println(d.computed)
}Mit lazy andere Eigenschaften lesen
Eine lazy-Eigenschaft kann auf andere, zuvor initialisierte Eigenschaften zugreifen und sie miteinander kombinieren.
class User(val first: String, val last: String) {
val fullName: String by lazy { "$first $last" }
}
fun main() {
val u = User("Ada", "Lovelace")
println(u.fullName)
}Praktisches Muster
Kombinieren Sie lateinit für Dependency Injection und by lazy für abgeleiteten Zustand in derselben Klasse.
class App {
lateinit var config: Map<String, String>
val host: String by lazy { config["host"] ?: "localhost" }
}
fun main() {
val app = App()
app.config = mapOf("host" to "api.example.com")
println(app.host) // api.example.com
}Kurze Überprüfung
Welches Schlüsselwort verschiebt die Initialisierung einer val-Eigenschaft bis zum ersten Zugriff?
Zusammenfassung
Verwenden Sie lateinit var für nicht nullfähige, veränderliche Eigenschaften, die später von Frameworks oder durch Dependency Injection zugewiesen werden. Verwenden Sie val by lazy für schreibgeschützte Werte, die beim ersten Zugriff einmalig berechnet werden sollen. Prüfen Sie den Status mit ::prop.isInitialized.
Lerne Kotlin mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „lateinit und verzögerte Initialisierung“ kostenlos?
Ja — der vollständige Text von „lateinit und verzögerte Initialisierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „lateinit und verzögerte Initialisierung“?
Verwenden Sie lateinit für später zugewiesene Properties und by lazy für verzögerte Berechnungen. Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Kotlin Academy zu starten?
Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „lateinit und verzögerte Initialisierung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?
Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Primärkonstruktor und Property-Parameter
- init-Blöcke und Initialisierungsreihenfolge
- Benutzerdefinierte Getter und Setter mit field
- lateinit und verzögerte Initialisierung