Standardparameter in Kotlin ermöglichen es, Standardwerte direkt in der Funktionssignatur anzugeben, wodurch der Code kompakter und flexibler wird. Diese Möglichkeit erhöht die Lesbarkeit und erleichtert die Wartung, indem die Notwendigkeit verringert wird, überladene Methoden mit unterschiedlichen Argumentanzahlen zu erstellen.
In Java müssen oft mehrere überladene Methoden für verschiedene Aufrufvarianten geschrieben werden. Kotlin hat einen prägnanten Weg zur Deklaration von Standardwerten entwickelt, was die API vereinfacht hat.
Die Überladung von Methoden für verschiedene Aufrufvarianten ist komplex und unpraktisch, führt zu überflüssigem Code und potenziellen Wartungsfehlern.
Kotlin ermöglicht die Deklaration von Standardparametern direkt in der Funktionsdefinition. Dies wird durch synthetische Begleitmethoden im JVM-Bytecode (bei Aufruf aus Java) oder durch einfaches Überspringen von Werten (aus Kotlin) realisiert. Zusammen mit benannten Parametern macht dies die Schnittstelle für Funktionsaufrufe sehr mächtig.
fun greet(name: String = "Guest", greeting: String = "Hello") { println("$greeting, $name!") } greet() // Hello, Guest! greet("Alice") // Hello, Alice! greet(greeting = "Hi") // Hi, Guest! greet("Bob", greeting = "Welcome") // Welcome, Bob!
Kann man Standardparameter in Methoden innerhalb von Schnittstellen verwenden?
Ja, aber der Standardwert wird nur bei Aufruf aus Kotlin implementiert, und beim Aufruf einer solchen Methode aus Java müssen die Argumente ausdrücklich angegeben werden.
Kann man Standardparameter für die ersten (linken) Parameter angeben und nicht nur für die letzten?
Ja, in Kotlin ist das möglich, insbesondere wenn benannte Argumente beim Aufruf verwendet werden. Allerdings kann es beim Gebrauch der Funktion aus Java zu Schwierigkeiten kommen, da Java keine benannten Argumente unterstützt und die Standardparameter rechts platziert sein müssen.
Wie funktioniert die Reihenfolge der Argumente bei gemischter Verwendung von positions- und benannten Parametern?
In Kotlin müssen nach dem ersten benannten Parameter alle folgenden benannt sein, andernfalls tritt ein Kompilierungsfehler auf.
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // Fehler: Positionales Argument kann nicht nach einem benannten Argument übergeben werden
In der Logging-Bibliothek wurden 10 überladene Methoden für verschiedene Logging-Kombinationen (mit Exception, mit Tag, ohne usw.) implementiert, was die Wartung unpraktisch macht.
Vorteile:
Nachteile:
Eine Funktion mit Standardwertargumenten wird verwendet:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
Vorteile:
Nachteile: