Parametry domyślne w Kotlinie pozwalają na określenie wartości domyślnych bezpośrednio w sygnaturze funkcji, co sprawia, że kod jest bardziej zwięzły i elastyczny. Ta możliwość zwiększa czytelność i ułatwia utrzymanie, zmniejszając potrzebę tworzenia przeciążonych metod z różną liczbą argumentów.
W Javie, aby mieć różne warianty wywołania funkcji, często trzeba pisać kilka przeciążonych metod. W Kotlinie opracowano zwięzły sposób deklaracji wartości domyślnych, co uprościło API.
Przeciążanie metod dla różnych wariantów wywołania jest skomplikowane i niewygodne, prowadzi do nadmiarowego kodu i potencjalnych błędów w utrzymaniu.
Kotlin pozwala na deklarowanie parametrów domyślnych bezpośrednio w definicji funkcji. Jest to realizowane przez syntetyczne metody towarzyszące w bajtkodzie JVM (jeśli są wywoływane z Javy) lub przez zwykłe pomijanie wartości (z Kotlinu). W połączeniu z nazwanymi parametrami czyni to interfejs wywoływania funkcji bardzo potężnym.
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!
Czy można używać parametrów domyślnych w funkcjach wewnątrz interfejsów?
Tak, jednak w takim przypadku wartość domyślna jest realizowana tylko przy wywołaniu z Kotlinu i przy wywołaniu takiej metody z Javy trzeba jawnie podać argumenty.
Czy można określić parametr domyślny dla pierwszych (nieprawych) parametrów, a nie tylko ostatnich?
Tak, w Kotlinie jest to możliwe, zwłaszcza gdy używane są nazwy argumentów przy wywołaniu. W przypadku korzystania z funkcji z Javy mogą wystąpić problemy, ponieważ Java nie obsługuje nazwanych argumentów, a parametry domyślne muszą znajdować się po prawej stronie.
Jak działa kolejność argumentów przy mieszanym używaniu pozycyjnych i nazwanych parametrów?
W Kotlinie po pierwszym nazwanym argumencie wszystkie kolejne muszą być nazwane, w przeciwnym razie wystąpi błąd kompilacji.
greet("Ivan", greeting = "Zdrastvuyte") // OK greet(greeting = "Zdrastvuyte", "Ivan") // Błąd: nie można przekazywać pozycyjnego po nazwanym argumencie
W bibliotece logowania zaimplementowano 10 przeciążonych metod dla różnych kombinacji logowania (z wyjątkiem, z tagiem, bez itd.), ich utrzymanie jest niewygodne.
Zalety:
Wady:
Używana jest funkcja z domyślnymi argumentami:
fun log(msg: String, tag: String = "", throwable: Throwable? = null) { ... }
Zalety:
Wady: