Kotlin unterstützt Standardwerte (default arguments) und benannte Parameter (named parameters), was im Vergleich zu Java eine größere Flexibilität bietet.
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
greet(greeting = "Hallo") // -> Hallo, User!
@JvmOverloads-Annotationen erforderlich sein.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")
Geschichte
Das Team integrierte ein Kotlin-Modul in ein Legacy-Java-Projekt und vergaß, die Annotation
@JvmOverloadsfü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.