Вам когда-нибудь казалось, что вы не получаете максимум от Kotlin? Наверняка казалось.
При работе с Kotlin легко придерживаться основ. Но некоторые из его менее известных возможностей могут действительно поднять ваш код на новый уровень!
В Kotlin более 60 функций, но разработчики используют в среднем только 5! Не упускаете ли вы всю мощь Kotlin?
Вкратце
Как Android-разработчики, мы ежедневно используем Kotlin и благодарим его безопасности и лаконичный синтаксис. Но Kotlin может предложить гораздо больше. Я вижу, как разработчики упускают из виду удобные фичи, которые могут сделать ваш код безопаснее, быстрее и выразительнее.
Kotlin содержит множество мощных, но недостаточно используемых возможностей, таких как runCatching
, герметичные интерфейсы, классы значений, buildList/buildMap
, Modifier.composed
, takeIf/takeUnless
и кастомные итераторы. Овладев ими, вы сможете сделать свой код более безопасным, лаконичным и высокопроизводительным.
Давайте рассмотрим 7 неизвестных функций Kotlin, которых вам следует использовать чаще.
1. runCatching {}
— благодатная обработка ошибок
Вместо блоков try-catch используйте runCatching {}
, чтобы элегантно обрабатывать в коде ошибки, успехи и неудачи:
val result = runCatching { riskyOperation() } result.onSuccess { println("Success: $it") } .onFailure { println("Error: ${it.message}") }
Гораздо чище, чем вложение всего в try-catch!
Примечание: runCatching
не перехватывает CancellationException
. Есть открытый запрос: https://github.com/Kotlin/kotlinx.coroutines/issues/1814.
2. Герметичные интерфейсы — строгая иерархия типов
В отличие от sealed классов, с помощью sealed интерфейсов можно обеспечить строгую иерархию типов в нескольких файлах. Идеально подходит для моделирования сложных машин состояний и типов данных!
sealed interface UiState class Loading : UiState class Success(val data: String) : UiState class Error(val message: String) : UiState
3. Value классы — легкие обертки
Для оберток с одним свойством встроенные классы позволяют избежать накладных расходов на выделение объектов по сравнению с классами данных.
@JvmInline value class UserId(val id: String)
4. buildList/buildMap
— неизменяемые коллекции
Вместо изменяемых коллекций используйте buildList {}
и buildMap {}
для создания более чистых неизменяемых структур данных:
val users = buildList { add("Alice") add("Bob") } println(users) // [Alice, Bob] val userScores = buildMap { put("Alice", 1) put("Bob", 2) } println(userScores) // {Alice=1, Bob=2}
5. takeIf/takeUnless
— условное присваивание в одной строке
takeIf {}
и takeUnless {}
позволяют выполнять условное присваивание в одной строке вместо операторов if
.
val input = "Hello" val validated = input.takeIf { it.length > 3 } ?: "Default" println(validated) // Hello val negativeNumber = -5.takeUnless { it > 0 } println(negativeNumber) // -5
6. Modifier.composed
в Jetpack Compose
Modifier.composed {}
в Jetpack Compose позволяет избежать ненужных перекомпоновок.
fun Modifier.bounceEffect() = composed { this.then(Modifier.scale(1.2f)) }
Обратите внимание: это больше не рекомендуется, используйте Modifier.Node
вместо этого: https://developer.android.com/develop/ui/compose/custom-modifiers#implement-custom.
7. iterator()
для кастомной итерации
Вы можете создавать пользовательские итераторы для любого класса, чтобы они работали без проблем с циклами forEach
.
class NumberRange(val start: Int, val end: Int) { operator fun iterator() = (start..end).iterator() } for (num in NumberRange(1, 5)) { println(num) // 1, 2, 3, 4, 5 }
Заключение
Если вы внедрите эти 7 мощных возможностей Kotlin в свою повседневную работу над кодом, вы будете писать более выразительный, безопасный, удобный в обслуживании код.
Хотя многие разработчики придерживаются основ Kotlin, истинная сила этого языка заключается в использовании всего набора его возможностей.
Начните с малого, внедряя по одной функции за раз, и вы быстро увидите, как они меняют ваш подход к решению задач и структуре кода.