0Pricing
Kotlin Academy · Lektion

noinline- und crossinline-Modifier

Steuern Sie das Inlining-Verhalten bestimmter Lambda-Parameter in inline-Funktionen.

noinline- und crossinline-Modifier ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 2 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.

Das Problem, das inline löst – und einführt

Wenn eine Funktion inline ist, werden standardmäßig alle ihre Lambda-Parameter inline eingefügt. Manchmal muss eine bestimmte Lambda nicht inline eingefügt werden – etwa um sie zu speichern oder an eine nicht-inline Funktion zu übergeben.

noinline: Eine Lambda als Objekt beibehalten

Stellen Sie einem bestimmten Lambda-Parameter noinline voran, um ihn vom Inlining auszunehmen, während die übrigen Parameter weiterhin inline eingefügt werden.

inline fun doWork(
    action: () -> Unit,
    noinline callback: () -> Unit   // stored, not inlined
) {
    action()                        // inlined at call site
    scheduleCallback(callback)      // passed as object — valid
}

Wann noinline erforderlich ist

Sie müssen noinline verwenden, wenn die Lambda:

  • in einer Variablen oder einem Feld gespeichert wird
  • an eine andere Funktion übergeben wird, die einen Funktionstyp erwartet
  • von der inline-Funktion zurückgegeben wird

crossinline: Nicht-lokale Rückgaben verbieten

crossinline wird verwendet, wenn eine inline eingefügte Lambda in einem anderen Ausführungskontext aufgerufen wird (z. B. innerhalb einer anderen Lambda oder in einem anderen Thread). Der Compiler erhält dadurch die Anweisung: Füge diese Lambda inline ein, erlaube darin aber keine nicht-lokalen Rückgaben.

inline fun runAsync(crossinline block: () -> Unit) {
    Thread {
        block()   // block is inlined but cannot use non-local return
    }.start()
}

Warum nicht-lokale Rückgaben hier problematisch sind

Wenn block eine nicht-lokale return-Anweisung verwenden könnte, würde sie versuchen, aus der Funktion zurückzukehren, die runAsync aufgerufen hat. Wenn der Thread jedoch ausgeführt wird, hat diese Funktion möglicherweise bereits zurückgegeben – was undefiniertes Verhalten verursachen würde. crossinline verhindert dies zur Compilezeit.

noinline und crossinline kombinieren

Eine einzelne inline-Funktion kann reguläre, noinline- und crossinline-Parameter kombinieren:

inline fun orchestrate(
    crossinline setup: () -> Unit,
    action: () -> Unit,
    noinline teardown: () -> Unit
) {
    Thread { setup() }.start()
    action()
    register(teardown)
}

Compilerfehler ohne crossinline

Wenn Sie eine inline eingefügte Lambda ohne crossinline an einen Lambda-Kontext übergeben, gibt der Compiler Folgendes aus: „'block' kann hier nicht inline eingefügt werden: Es könnte nicht-lokale Rückgaben enthalten. Fügen Sie den Modifizierer crossinline hinzu.“

Verwendung in der Standardbibliothek

Die Standardbibliothek verwendet crossinline in Funktionen wie Sequence { } und einigen Coroutine-Buildern, um sicherzustellen, dass die vom Benutzer bereitgestellte Lambda sicher in einem anderen Kontext ausgeführt wird.

noinline deaktiviert inline nicht

Wenn Sie einen Parameter mit noinline markieren, wird das Inlining nicht für die gesamte Funktion deaktiviert. Der Funktionskörper und alle anderen Lambda-Parameter werden weiterhin inline eingefügt. Nur die mit noinline markierte Lambda behält ihre Objektidentität.

Überlegungen zur Performance

noinline verursacht für diesen einen Parameter die üblichen Kosten für die Reservierung eines Lambda-Objekts. crossinline fügt weiterhin inline ein – die einzige Einschränkung besteht darin, nicht-lokale Rückgaben zu verbieten. Keiner der beiden Modifizierer beeinflusst das Inlining anderer Parameter.

Übersichtstabelle

Zusammenfassung der Modifizierer:

  • Kein Modifizierer → Lambda vollständig inline eingefügt, nicht-lokale Rückgaben erlaubt
  • noinline → Lambda als Objekt beibehalten, kann gespeichert oder übergeben werden
  • crossinline → Lambda inline eingefügt, nicht-lokale Rückgaben verboten

Kurzer Check

Wann müssen Sie einen Lambda-Parameter einer inline-Funktion mit noinline markieren?

Zusammenfassung: noinline und crossinline

Die wichtigsten Punkte:

  • noinline: behält eine Lambda als Objekt innerhalb einer ansonsten inline eingefügten Funktion bei
  • crossinline: fügt die Lambda inline ein, verbietet aber nicht-lokale Rückgaben für eine sichere Verwendung über verschiedene Kontexte hinweg
  • Beide Modifizierer gelten pro Parameter und nicht für die gesamte Funktion

Häufig gestellte Fragen

Ist die Lektion „noinline- und crossinline-Modifier“ kostenlos?

Ja — der vollständige Text von „noinline- und crossinline-Modifier“ 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 „noinline- und crossinline-Modifier“?

Steuern Sie das Inlining-Verhalten bestimmter Lambda-Parameter in inline-Funktionen. 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 2 von 4.

Wie lange dauert die Lektion „noinline- und crossinline-Modifier“?

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. inline-Funktionen: Lambda-Overhead vermeiden
  2. noinline- und crossinline-Modifier
  3. Reifizierte Typparameter: Auf T zur Laufzeit zugreifen
  4. Praktische reified-Muster: Parsing, DI und Serialisierung
← Zurück zu Kotlin Academy