0Pricing
Kotlin Academy · Lektion

by lazy: Vertiefung zur verzögerten Initialisierung

Entdecken Sie die Modi der verzögerten Initialisierung: SYNCHRONIZED, PUBLICATION und NONE.

by lazy: Vertiefung zur verzögerten Initialisierung ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 1 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.

Was ist by lazy?

by lazy verzögert die Initialisierung eines val bis zum ersten Zugriff. Das Lambda wird einmal ausgeführt und das Ergebnis zwischengespeichert.

val greeting: String by lazy {
    println("Computing...")
    "Hello, Kotlin!"
}
fun main() {
    println(greeting) // prints Computing... then Hello, Kotlin!
    println(greeting) // prints Hello, Kotlin! (cached)
}

Lazy-Syntax

Der by lazy-Delegate nimmt ein Lambda entgegen, dessen Werttyp aus der Property-Deklaration abgeleitet wird.

val pi: Double by lazy { Math.PI }
val appName: String by lazy { "MyApp v1.0" }
fun main() {
    println(pi)      // 3.141592653589793
    println(appName) // MyApp v1.0
}

SYNCHRONIZED-Modus (Standard)

Standardmäßig verwendet lazy LazyThreadSafetyMode.SYNCHRONIZED: Nur ein Thread initialisiert den Wert.

val heavyResource: String by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
    Thread.sleep(100) // simulate work
    "Resource ready"
}
fun main() { println(heavyResource) }

PUBLICATION-Modus

PUBLICATION erlaubt mehreren Threads, die Initialisierung gleichzeitig auszuführen; das erste Ergebnis gewinnt. Verwenden Sie diesen Modus, wenn die Initialisierung günstig und frei von Seiteneffekten ist.

val config: Map<String, String> by lazy(LazyThreadSafetyMode.PUBLICATION) {
    mapOf("host" to "localhost", "port" to "8080")
}
fun main() { println(config["host"]) }

NONE-Modus

NONE verursacht keinen Synchronisierungs-Overhead. Verwenden Sie ihn nur in Single-Thread-Kontexten, in denen die Performance wichtig ist.

val singleThreadValue: Int by lazy(LazyThreadSafetyMode.NONE) {
    42
}
fun main() { println(singleThreadValue) }

Lazy in einer Klasse

by lazy innerhalb einer Klasse initialisiert sich beim ersten Zugriff auf die Property. Das ist nützlich für aufwendige Berechnungen, die an den Instanzzustand gebunden sind.

class DatabaseConnection(val url: String) {
    val pool: String by lazy {
        println("Connecting to $url")
        "Pool@$url"
    }
}
fun main() {
    val db = DatabaseConnection("localhost:5432")
    println(db.pool)
}

Lazy und lateinit

Verwenden Sie by lazy für ein val mit komplexer Initialisierung. Verwenden Sie lateinit für ein var, das extern zugewiesen wird, etwa in Tests oder bei Dependency Injection.

class MyService {
    val computed: List<Int> by lazy { (1..100).toList() }
    lateinit var injected: String
}
fun main() {
    val s = MyService()
    s.injected = "injected value"
    println(s.computed.size)
    println(s.injected)
}

isInitialized-Prüfung

Prüfen Sie mit .isInitialized(), ob eine Lazy-Property initialisiert wurde – allerdings nur über die Delegate-Referenz.

val myLazy: String by lazy { "initialized" }
fun main() {
    val ref = ::myLazy
    // No direct isInitialized on val lazy, but we can check via delegate
    println(myLazy)
}

Lazy mit Abhängigkeit

Lazy-Properties können auf andere Lazy-Properties verweisen und so eine verzögerte Initialisierungskette bilden.

val baseUrl: String by lazy { "https://api.example.com" }
val usersUrl: String by lazy { "$baseUrl/users" }
val postsUrl: String by lazy { "$baseUrl/posts" }
fun main() {
    println(usersUrl)
    println(postsUrl)
}

Praxis: Singleton-Service

Verwenden Sie by lazy in object-Deklarationen, um aufwendige Singletons erst bei Bedarf zu initialisieren.

object Analytics {
    val client: String by lazy {
        println("Initializing analytics client")
        "AnalyticsClient@ready"
    }
}
fun main() {
    println("App started")
    println(Analytics.client) // initialized on first use
    println(Analytics.client) // cached
}

Verzögerte Regex-Kompilierung

Die Kompilierung eines regulären Ausdrucks ist aufwendig. Verwenden Sie by lazy, um ihn einmal zu kompilieren und wiederzuverwenden und so wiederholten Aufwand zu vermeiden.

val emailRegex: Regex by lazy {
    Regex("^[A-Za-z0-9+_.-]+@(.+)$")
}
fun isValidEmail(email: String) = emailRegex.matches(email)
fun main() {
    println(isValidEmail("user@example.com")) // true
    println(isValidEmail("bad-email"))         // false
}

Kurztest

Welchen Lazy-Modus sollten Sie in einer Single-Thread-Umgebung für maximale Performance verwenden?

Zusammenfassung

by lazy führt sein Lambda beim ersten Zugriff einmal aus und speichert das Ergebnis zwischen. Wählen Sie SYNCHRONIZED (Standard) für Thread-Sicherheit, PUBLICATION für eine nebenläufige, idempotente Initialisierung und NONE für Performance in Single-Thread-Umgebungen.

Häufig gestellte Fragen

Ist die Lektion „by lazy: Vertiefung zur verzögerten Initialisierung“ kostenlos?

Ja — der vollständige Text von „by lazy: Vertiefung zur verzögerten 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 „by lazy: Vertiefung zur verzögerten Initialisierung“?

Entdecken Sie die Modi der verzögerten Initialisierung: SYNCHRONIZED, PUBLICATION und NONE. 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 1 von 4.

Wie lange dauert die Lektion „by lazy: Vertiefung zur verzögerten 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

  1. by lazy: Vertiefung zur verzögerten Initialisierung
  2. observable- und vetoable-Delegates
  3. Einen benutzerdefinierten ReadWriteProperty-Delegate schreiben
  4. Delegates für Preferences, Map-basierte Properties und Logging
← Zurück zu Kotlin Academy