Kotlin поддерживает значения по умолчанию (default arguments) и именованные параметры (named parameters), что дает большую гибкость по сравнению с Java.
fun greet(name: String = "User", greeting: String = "Hello") { println("$greeting, $name!") }
greet(greeting = "Привет") // -> Привет, User!
@JvmOverloads.Можно ли смешивать позиционные и именованные аргументы в любом порядке при вызове функции в Kotlin?
Правильный ответ: Нет, после того как вы указали хотя бы один именованный аргумент, все последующие должны быть именованными. Нарушение вызовет ошибку компиляции.
// Неверно greet(greeting = "Hi", "Ivan") // Ошибка! // Верно greet("Ivan", greeting = "Hi") greet(name = "Ivan", greeting = "Hi")
История
Команда интегрировала Kotlin-модуль с legacy Java-проектом и забыла добавить аннотацию
@JvmOverloadsдля функции с default-параметрами. В результате Java-код не видел необходимых overload-методов — возникали runtime ошибки при вызове.
История
При рефакторинге с использованием именованных параметров разработчик случайно переставил местами аргументы — при дальнейшей смене названий параметров это прошло незамеченно (типизация не нарушена, но семантика вызова изменилась!). Это привело к странным багам в логике UI, обнаружили не сразу.
История
Один из разработчиков в попытке повысить читабельность смешал позиционные и именованные аргументы в середине вызова. Код не компилировался, но команда с трудом поняла, в чем именно проблема — т.к. часто встречали это в других языках и ожидали аналогичного поведения от Kotlin.