programowanieProgramista Android

Jak działają argumenty domyślne i parametry nazwane w Kotlinie? Opowiedz o różnicach w porównaniu do Javy, niuansach przekazywania argumentów, kompilacji z metodami przeciążającymi, kolejności parametrów nazwanych i pozycyjnych. Podaj przykład.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

Kotlin obsługuje argumenty domyślne (default arguments) i parametry nazwane (named parameters), co daje większą elastyczność w porównaniu do Javy.

Główne punkty:

  • W Kotlinie parametry funkcji mogą mieć wartości domyślne:
    fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
  • Można wywołać funkcję, podając tylko potrzebne parametry — pozostałe wypełnią się domyślnymi wartościami.
  • Parametry nazwane pozwalają jawnie określić nazwę argumentu — szczególnie wygodne, gdy funkcja ma wiele parametrów:
    greet(greeting = "Cześć") // -> Cześć, User!
  • Można łączyć zwykłe (pozycyjne) i nazwane parametry, dopóki nazwane nie są używane w środku wywołania.
  • W przeciwieństwie do Javy (gdzie robią przeciążenie dla każdej kombinacji), Kotlin kompiluje argumenty domyślne do metod przeciążających tylko dla interoperacyjności z Javą, a wewnątrz Kotlinu tego nie widać.

Niuanse:

  • Po użyciu nazwanego argumentu, wszystkie następne argumenty również muszą być nazwane.
  • Aby używać funkcji z parametrami domyślnymi z Javy, mogą być potrzebne adnotacje @JvmOverloads.

Pytanie pułapka.

Czy można mieszać argumenty pozycyjne i nazwane w dowolnej kolejności podczas wywoływania funkcji w Kotlinie?

Prawidłowa odpowiedź: Nie, po wskazaniu choćby jednego nazwanego argumentu, wszystkie następne muszą być nazwane. Naruszenie tego spowoduje błąd kompilacji.

// Niepoprawne greet(greeting = "Cześć", "Ivan") // Błąd! // Poprawne greet("Ivan", greeting = "Cześć") greet(name = "Ivan", greeting = "Cześć")

Przykłady realnych błędów z powodu nieznajomości subtelności tematu.


Historia

Zespół zintegrował moduł Kotlin z legacy projektem Java i zapomniał dodać adnotację @JvmOverloads dla funkcji z parametrami domyślnymi. W rezultacie kod Java nie widział potrzebnych metod przeciążających — wystąpiły błędy czasów wykonywania przy wywołaniu.


Historia

Podczas refaktoryzacji z użyciem parametrów nazwanych, programista przypadkowo zamienił miejscami argumenty — przy dalszej zmianie nazw parametrów to przeszło niezauważone (typizacja nie została naruszona, ale semantyka wywołania się zmieniła!). Doprowadziło to do dziwnych błędów w logice UI, odkryto to nie od razu.


Historia

Jeden z programistów próbując zwiększyć czytelność, wymieszał argumenty pozycyjne i nazwane w środku wywołania. Kod nie kompilował się, ale zespół miał trudności z zrozumieniem, na czym dokładnie polega problem — ponieważ często spotykali to w innych językach i oczekiwali podobnego zachowania od Kotlina.