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 werdencrossinline→ 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 beicrossinline: 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
- inline-Funktionen: Lambda-Overhead vermeiden
- noinline- und crossinline-Modifier
- Reifizierte Typparameter: Auf T zur Laufzeit zugreifen
- Praktische reified-Muster: Parsing, DI und Serialisierung