Wie man ein Kotlin-Vorstellungsgespräch meistert: Die wichtigsten Fragen
Kotlin hat sich fest als Hauptsprache für die Android-Entwicklung etabliert und wird aktiv im Backend-Bereich (Ktor, Spring Boot) eingesetzt. Ein Vorstellungsgespräch für eine Position als Kotlin-Entwickler prüft nicht nur die Syntax, sondern auch das Verständnis der Sprachphilosophie: Null Safety, Coroutinen, funktionaler Ansatz. In diesem Artikel haben wir die häufigsten Fragen, die in Interviews gestellt werden, mit Codebeispielen und Erklärungen aufgeschlüsselt.
1. Null Safety: Wie Kotlin gegen NullPointerException vorgeht
Einer der Hauptvorteile von Kotlin ist der integrierte Schutz vor null. Im Gegensatz zu Java, wo jeder Verweis null sein kann, sind die Typen in Kotlin in nullable und non-null unterteilt.
Frage: Was ist der Unterschied zwischen ? und !!?
? — der sichere Aufrufoperator. Wenn das Objekt null ist, gibt der Aufruf einer Methode oder Eigenschaft einfach null zurück, ohne eine Ausnahme auszulösen.
val name: String? = nullval length = name?.length // null, kein Fehler!! — die Non-Null-Assertion. Sie garantieren, dass der Wert nicht null ist. Wenn er null ist, wird eine NullPointerException ausgelöst.
val length = name!!.length // NPE wenn name == nullFrage: Was ist der Elvis-Operator ?:?
Er erlaubt es, einen Standardwert festzulegen, falls links null steht.
val name: String? = nullval display = name ?: "Gast"Frage: Wie funktioniert let mit nullable-Typen?
let wird nur ausgeführt, wenn das Objekt nicht null ist. Dies ist eine idiomatische Methode zur Verarbeitung von nullable-Werten.
name?.let { println("Name: $it")}2. Coroutinen: Asynchronität ohne Schmerz
Coroutinen sind leichtgewichtige Threads, mit denen asynchroner Code in einem imperativen Stil geschrieben werden kann. In Vorstellungsgesprächen wird das Verständnis von Scopes, Dispatchern und suspend-Funktionen geprüft.
Frage: Was ist der Unterschied zwischen launch und async?
launch— startet eine Coroutine, gibt ein Job zurück. Liefert kein Ergebnis zurück.async— startet eine Coroutine, gibt ein Deferred zurück (Analog zu Future). Das Ergebnis erhalten wir über.await().
coroutineScope { val job = launch { delay(100) } val deferred = async { 42 } val result = deferred.await() // 42}Frage: Was ist ein CoroutineContext und was sind Dispatcher?
CoroutineContext — eine Menge von Elementen, die das Verhalten einer Coroutine bestimmen (Dispatcher, Job, Name). Die wichtigsten Dispatcher sind:
Dispatchers.Main— für die UI (Android).Dispatchers.IO— für Ein-/Ausgabe (Netzwerk, Dateien).Dispatchers.Default— für CPU-intensive Aufgaben.
Frage: Was ist withContext?
Erlaubt es, den Dispatcher innerhalb einer Coroutine zu wechseln, ohne den Scope zu ändern.
suspend fun loadData(): String = withContext(Dispatchers.IO) { // langwierige Operation "Daten"}3. Klassen und Objekte: sealed, data, companion
Kotlin bietet mehrere spezielle Klassentypen, die typische Muster vereinfachen.
Frage: Was ist eine sealed class und wann wird sie verwendet?
Eine sealed class ist eine abstrakte Klasse mit einer begrenzten Anzahl von Unterklassen. Alle Nachkommen sind zur Kompilierzeit bekannt. Ideal zur Darstellung von Zuständen (UI State) oder Ergebnissen von Operationen.
sealed class Result { data class Success(val data: String) : Result() data class Error(val message: String) : Result() object Loading : Result()}
fun handleResult(result: Result) { when (result) { is Result.Success -> println(result.data) is Result.Error -> println(result.message) Result.Loading -> println("Laden...") }}Ein else-Zweig ist nicht nötig — der Compiler kennt alle Varianten.