ProgrammierungAndroid-Entwickler

Wie funktionieren Standardargumente und benannte Parameter in Kotlin? Erklären Sie die Unterschiede zu Java, die Nuancen der Argumentübergabe, die Kompilierung mit Überladungsfunktionen und die Reihenfolge von benannten und positionellen Parametern. Geben Sie ein Beispiel an.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Kotlin unterstützt Standardwerte (default arguments) und benannte Parameter (named parameters), was im Vergleich zu Java eine größere Flexibilität bietet.

Hauptpunkte:

  • In Kotlin können Funktionsparameter Standardwerte haben:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • Man kann die Funktion aufrufen und nur die benötigten Parameter angeben — die anderen werden mit Standardwerten aufgefüllt.
  • Benannte Parameter ermöglichen es, den Namen des Arguments explizit anzugeben — besonders praktisch, wenn eine Funktion viele Parameter hat:
    greet(greeting = "Hallo") // -> Hallo, User!
  • Man kann normale (positionale) und benannte Parameter kombinieren, solange die benannten Parameter nicht in der Mitte des Aufrufs verwendet werden.
  • Im Gegensatz zu Java (wo für jede Kombination eine Überladung gemacht wird) kompiliert Kotlin Standardargumente in Überladungsfunktionen nur für die Interoperabilität mit Java, intern sieht man das in Kotlin nicht.

Nuancen:

  • Nach der Verwendung eines benannten Arguments müssen auch die folgenden Argumente benannt sein.
  • Um Funktionen mit Standardparametern aus Java zu verwenden, können @JvmOverloads-Annotationen erforderlich sein.

Fangfrage.

Kann man positionale und benannte Argumente in beliebiger Reihenfolge beim Aufruf einer Funktion in Kotlin mischen?

Richtige Antwort: Nein, nachdem Sie mindestens ein benanntes Argument angegeben haben, müssen alle folgenden ebenfalls benannt sein. Ein Verstoß führt zu einem Kompilierungsfehler.

// Falsch greet(greeting = "Hi", "Ivan") // Fehler! // Richtig greet("Ivan", greeting = "Hi") greet(name = "Ivan", greeting = "Hi")

Beispiele für reale Fehler aufgrund von Unkenntnis der Feinheiten des Themas.


Geschichte

Das Team integrierte ein Kotlin-Modul in ein Legacy-Java-Projekt und vergaß, die Annotation @JvmOverloads für die Funktion mit Standardparametern hinzuzufügen. Infolgedessen sah der Java-Code die erforderlichen Überladungsfunktionen nicht — es traten Laufzeitfehler beim Aufruf auf.


Geschichte

Bei der Refaktorisierung unter Verwendung von benannten Parametern hat der Entwickler versehentlich die Argumente vertauscht — bei späteren Änderungen der Parameternamen wurde dies nicht bemerkt (die Typisierung war nicht verletzt, aber die Semantik des Aufrufs hat sich geändert!). Dies führte zu seltsamen Bugs in der Logik der Benutzeroberfläche, die nicht sofort entdeckt wurden.


Geschichte

Einer der Entwickler versuchte, die Lesbarkeit zu erhöhen, indem er positionale und benannte Argumente in der Mitte des Aufrufs mischte. Der Code ließ sich nicht kompilieren, aber das Team hatte Schwierigkeiten, das tatsächliche Problem zu verstehen — da sie dies oft in anderen Sprachen erlebt hatten und ein ähnliches Verhalten von Kotlin erwarteten.