Ответ
Да, работал. 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. Разница же, ёб твою мать, очевидна!
Короче, расширения — это пиздец как круто. Начинаешь их использовать, и потом на чистую джаву смотреть тошно, как на мартышлюшку, которая пытается открутить гайку голыми руками, когда у тебя уже есть разводной ключ.