Для чего нужны extension функции в Kotlin
Что проверяют
Понимаете ли вы, что это статический синтаксический приём, а не настоящее добавление метода в класс.
Как отвечать
Функция-расширение позволяет вызывать свою функцию так, будто она метод чужого типа, не наследуя его и не меняя исходники:
fun String.isValidSlug(): Boolean = matches(Regex("[a-z0-9-]+"))
"go-developer".isValidSlug()Компилятор превращает это в обычную статическую функцию, которой объект передаётся первым аргументом. Отсюда все следствия:
- нет доступа к приватным членам типа;
- разрешается статически, по объявленному типу, а не по фактическому. Переопределить метод расширением нельзя, а при совпадении имён настоящий метод класса всегда побеждает;
- не участвует в полиморфизме: вызов не зависит от того, что реально лежит в переменной.
Зачем это нужно: добавлять удобные операции к типам из стандартной библиотеки и чужих зависимостей, разгружать классы от вспомогательных методов, писать читаемые цепочки. На расширениях построена значительная часть стандартной библиотеки (let, apply, map для коллекций) и предметно-ориентированные конструкции вроде buildString.
Бывают и расширения-свойства, и расширения с типом-приёмником внутри лямбды, на которых строятся билдеры.
Где спотыкаются
Думают, что расширение действительно добавляется в класс.
Ожидают полиморфного поведения и удивляются, что вызывается версия по объявленному типу.
Пытаются обратиться из расширения к приватному полю.
Пишут расширение для типа, который контролируют сами, вместо обычного метода.