Top-Fehler von Kotlin-Anfängern: Von A bis Z
Kotlin ist eine moderne, prägnante und sichere Sprache, die schnell die Herzen von Android-Entwicklern und Backend-Ingenieuren erobert hat. Aber selbst in einer so freundlichen Sprache machen Anfänger oft typische Fehler, die das Lernen verlangsamen und zu Bugs führen. In diesem Artikel analysieren wir die häufigsten Probleme – vom falschen Verständnis von null safety bis zum übermäßigen Gebrauch von lateinit. Sie erfahren, wie Sie diese vermeiden und sauberen, effizienten Code in Kotlin schreiben.
1. Ignorieren von null safety und falscher Umgang mit nullable Typen
Eines der Hauptmerkmale von Kotlin ist der integrierte Schutz vor NullPointerException. Aber Anfänger versuchen oft, den Java-Ansatz zu verwenden, was zu Fehlern führt.
Fehler: Verwendung von !! (non-null assertion) wo es nicht nötig ist
Viele schreiben:
fun getUserName(user: User?): String { return user!!.name // Wenn user == null — wird NPE ausgelöst}Besser ist die Verwendung des sicheren Aufrufs (?.) oder des Elvis-Operators (?:):
fun getUserName(user: User?): String { return user?.name ?: "Gast"}Fehler: Falsche Verwendung von lateinit var
Das Feld lateinit ist für Situationen gedacht, in denen Sie genau wissen, dass die Variable vor der ersten Verwendung initialisiert wird (z.B. in Android im onCreate). Aber wenn Sie vor der Initialisierung auf lateinit zugreifen, erhalten Sie eine UninitializedPropertyAccessException.
Tipp: Verwenden Sie lateinit nur mit var und prüfen Sie die Eigenschaft ::variable.isInitialized vor dem Zugriff.
2. Falsche Verwendung von Collections: veränderbar vs. unveränderbar
Kotlin unterscheidet klar zwischen List (nur lesbar) und MutableList. Anfänger verwechseln sie oft, was zu Kompilierungsfehlern oder unerwartetem Verhalten führt.
Fehler: Versuch, eine unveränderbare Liste zu ändern
val list = listOf(1, 2, 3)list.add(4) // Kompilierungsfehler! listOf gibt List zurück, nicht MutableListWenn Sie eine veränderbare Collection benötigen, verwenden Sie mutableListOf:
val mutableList = mutableListOf(1, 2, 3)mutableList.add(4) // FunktioniertFehler: Rückgabe von MutableList aus einer öffentlichen API
Dies verletzt die Kapselung. Besser ist es, List zurückzugeben:
// Schlechtfun getItems(): MutableList<String> = mutableListOf("a", "b")
// Gutfun getItems(): List<String> = mutableListOf("a", "b").toList()3. Übermäßiger Gebrauch von companion object anstelle von Top-Level-Funktionen
Kotlin hat keine statischen Methoden, aber dafür companion object. Anfänger packen oft alles Mögliche hinein, obwohl prägnantere Top-Level-Funktionen oder -Eigenschaften verwendet werden könnten.
Beispiel für einen Fehler:
class Utils { companion object { fun formatDate(date: Date): String { ... } }}
// Aufruf: Utils.formatDate(...)Besser ist es, die Funktion auf Dateiebene zu setzen:
// Datei: DateUtils.ktfun formatDate(date: Date): String { ... }
// Aufruf: formatDate(...)Dies macht den Code sauberer und erfordert keine zusätzliche Klasse. Verwenden Sie companion object nur für Factory-Methoden oder Konstanten, die mit der Klasse verbunden sind.
4. Missverständnis von sealed Klassen und when-Ausdrücken
Sealed Klassen sind ein mächtiges Werkzeug zur Darstellung einer begrenzten Typhierarchie. Anfänger vergessen jedoch oft den else-Zweig oder verwenden if-else anstelle von when, wodurch alle Vorteile verloren gehen.
Fehler: Verwendung von else in when für eine sealed Klasse
sealed class Result { data class Success(val data: String) : Result() data