Site icon AppTractor

7 мощных возможностей Kotlin, используемых продвинутыми разработчиками

Вам когда-нибудь казалось, что вы не получаете максимум от 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, истинная сила этого языка заключается в использовании всего набора его возможностей.

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

Источник

Exit mobile version