Публикация

Extension Function в Kotlin

Хотел бы коротко рассмотреть такую полезнейшую фитчу в Kotlin как функции расширения или же extension functions.

Kotlin поддерживает возможность расширения класса новыми функциями без наследования или даже использование шаблона декоратор.

Что такое Extension Function?

Пару слов об Extension Function для тех кто не знаком с этим термином. Если просто то это функция класса, которая определена за его пределами.

Для примера я хочу чтобы обращаясь к экземпляру класса String я мог вызвать функцию toEmail, которая бы просто добавляла в конец строки @mail.com :

"mystring".toEmail()

Как мы понимаем зайти в String класс и добавить туда этот метод мы не можем, именно для этого и существуют функции расширения.

Сами же по себе функции расширения это ничто иное как сахар, который делает ваш код более читаемым и легким в поддержке.

Как использовать?

Синтаксически все просто, сначала вы указываете имя класса который будет расширять наша функция а после имя функции и ее имплементация:

fun [class_name].[method_name]() {}

Как вы уже возможно догадались мы расширять мы можем любой класс в том числе со сторонних библиотек тут нет ограничений. Тот же пример с toEmail:

fun String.toEmail() {
	return this + "@email.com"
}

Также обратите внимание на то что реализуя функцию расширения мы смело можем использовать ключевое слово this которое ссылается на контекст расширяемого класса. В нашем случае String, где this наше значение. Точно также мы можем обращаться к его свойствам или даже вызывать его методы.

Каждый на своем опыте уже сможет найти уйму случаев где можно применить данную возможность, тут все упирается в конкретную ситуацию и случай.

Например ниже реальный пример с одного из проектов на которые я работал:

fun <T> Optional<T>.unwrap(): T? = orElse(null)

На сколько полезный или даже правильный пример тут можно поспорить, но все упирается в конкретные задачи которые решались.

Опубликовано: 29 января 2021 г.Просмотров: 55

Комментарии

Мы не даем слово анониму 😶
Войдите, пожалуйста.

Еще никто не комментировал эту публикацию 🤔