Работал ли с Extensions в Kotlin

Ответ

Да, работал. Kotlin Extensions позволяют расширять функциональность существующих классов без наследования.

Пример:

// Расширение для String
fun String.addExclamation(): String = "$this!"

// Использование
val greeting = "Hello".addExclamation() // "Hello!"

Android-пример (ViewExtensions.kt):

fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }

// Использование в Activity/Fragment
button.hide()

Особенности:

  • Не изменяют исходный класс.
  • Могут быть объявлены как extension-функции или extension-свойства.
  • Работают через статический импорт.
  • Полезны для улучшения читаемости кода и уменьшения boilerplate.

Ответ 18+ 🔞

А, ну это же про расширения в Котлине! Да, работал с ними, конечно. Это ж одна из главных фишек языка, без которой вообще непонятно, как раньше жили. Ёпта, просто магия какая-то, а не инструмент.

Вот смотри, как это работает, на простом примере:

// Берём класс String и натягиваем на него свою функцию, как презерватив
fun String.addExclamation(): String = "$this!"

// Используем
val greeting = "Hello".addExclamation() // Получится "Hello!", ядрёна вошь!

Представляешь? Ты берёшь системный класс, который тебе не принадлежит, и нахуяриваешь ему свои методы. Сам от себя охуевал, когда впервые увидел. Это как если бы ты к соседскому забору приделал свою калитку — удобно, а ему нихуя не скажешь.

Вот тебе реальный пример из андроида, чтоб совсем понятно было (файл ViewExtensions.kt):

// Вместо того чтобы каждый раз писать view.visibility = View.GONE, делаем так
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }

// А в коде потом просто пишешь
button.hide() // и всё, блядь! Кнопка накрылась медным тазом.
textView.show() // а текст появился. Красота!

А теперь про особенности, чтоб ты не обосрался на ровном месте:

  • Исходный класс не трогается. Это самое главное! Ты не лезешь внутрь String или View со своими грязными руками. Ты просто снаружи прикручиваешь свою логику. Чисто, аккуратно, доверия ебать ноль к самому классу.
  • Можно делать и функции, и свойства. Хочешь функцию — fun String.что-то(). Хочешь свойство — val String.длинаВСантиметрах. Удобно, как хуй с пальто.
  • Работают через статический импорт. То есть если ты не импортнул файл с расширениями в свой класс — нихуя не сработает. Не забывай про это, распиздяй.
  • Польза — овердохуища. Читаемость кода взлетает до небес. Вместо кучи однотипного boilerplate-кода (этого повторяющегося говна) ты пишешь короткие, понятные вызовы. view.hide() вместо view.visibility = View.GONE. Разница же, ёб твою мать, очевидна!

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