Standaardparameters in Kotlin stellen je in staat om standaardwaarden direct in de functiehandtekening op te geven, waardoor de code compacter en flexibeler wordt. Deze mogelijkheid verhoogt de leesbaarheid en vergemakkelijkt het onderhoud, omdat het de noodzaak om overladen methoden met een verschillend aantal argumenten te creëren vermindert.
In Java moet je vaak meerdere overladen methoden schrijven voor verschillende oproepvarianten. In Kotlin is een beknopte manier ontwikkeld om standaardwaarden op te geven, wat het API vereenvoudigt.
Overbelasting van methoden voor verschillende oproepvarianten is complex en ongemakkelijk, wat leidt tot overbodige code en potentiële onderhoudsfouten.
Kotlin laat je standaardparameters direct in de functie-definitie opgeven. Dit is geïmplementeerd via synthetische companion methods op JVM-bytecode (wanneer aangeroepen vanuit Java) of door simpelweg waarden over te slaan (vanuit Kotlin). Samen met benoemde parameters maakt dit de interface voor functieaanroepen zeer krachtig.
fun greet(name: String = "Gast", greeting: String = "Hallo") { println("$greeting, $name!") } greet() // Hallo, Gast! greet("Alice") // Hallo, Alice! greet(greeting = "Hoi") // Hoi, Gast! greet("Bob", greeting = "Welkom") // Welkom, Bob!
Kun je standaardparameters gebruiken in functies binnen interfaces?
Ja, maar de standaardwaarde wordt alleen geïmplementeerd als de functie vanuit Kotlin wordt aangeroepen, en bij het aanroepen van deze methode vanuit Java moeten de argumenten expliciet worden opgegeven.
Kun je een standaardparameter opgeven voor de eerste (onbenoembare) parameters, en niet alleen de laatste?
Ja, in Kotlin is dit mogelijk, vooral als benoemde argumenten bij de aanroep worden gebruikt. Echter, bij het gebruik van de functie vanuit Java kunnen er complicaties ontstaan, omdat Java geen benoemde argumenten ondersteunt en standaardparameters aan de rechterkant moeten komen.
Hoe werkt de volgorde van argumenten bij gemengde gebruik van positionele en benoemde parameters?
In Kotlin moeten na de eerste benoemde parameter alle volgende ook benoemd zijn, anders ontstaat er een compilatiefout.
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // Fout: kan positioneel argument niet na benoemd argument doorgeven
In de loggingbibliotheek zijn 10 overladen methoden geïmplementeerd voor verschillende combinaties van logging (met Exception, met Tag, zonder, enz.), het is ongemakkelijk om ze te onderhouden.
Voordelen:
Nadelen:
Een functie met standaardargumenten wordt gebruikt:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
Voordelen:
Nadelen: