Kotlin-библиотеки, которые спасут ваш проект в 2024

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Kotlin — это не просто "ещё один язык для JVM"?

Когда в 2016 году JetBrains выпустила Kotlin, мало кто мог предсказать, что через несколько лет этот язык станет стандартом для Android-разработки и одним из главных претендентов на трон в мире backend. Сегодня Kotlin — это не просто синтаксический сахар над Java. Это мощная экосистема, где каждая библиотека решает конкретную задачу элегантно и с минимальным количеством бойлерплейта.

В этой статье мы разберём самые популярные Kotlin библиотеки, которые реально упрощают жизнь разработчику. Мы не будем перечислять все подряд — только то, что стоит изучить прямо сейчас. Поехали!

1. Ktor — ваш новый HTTP-клиент и сервер

Если вы ищете лёгкий, асинхронный и полностью конфигурируемый HTTP-клиент (или даже сервер) — Ktor станет вашим лучшим другом. В отличие от тяжеловесного Spring Boot, Ktor не навязывает архитектуру. Вы сами решаете, какие модули подключать.

Пример: HTTP-клиент для получения данных

import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.request.*
import io.ktor.client.statement.*

suspend fun main() {
    val client = HttpClient(CIO)
    val response: HttpResponse = client.get("https://api.github.com/repos/jetbrains/kotlin")
    println("Статус: ${response.status}")
    println("Тело: ${response.bodyAsText()}")
    client.close()
}

Ktor поддерживает плагины для сериализации, сжатия, логирования и аутентификации. Это одна из самых популярных Kotlin библиотек для работы с сетью.

2. Kotlinx.serialization — сериализация без боли

Забудьте про Gson и Jackson. Kotlinx.serialization работает на уровне компилятора, а не рефлексии. Это даёт прирост производительности и полную типобезопасность.

Пример: сериализация data класса в JSON

import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class User(val name: String, val age: Int)

fun main() {
    val user = User("Анна", 28)
    val jsonString = Json.encodeToString(user)
    println(jsonString) // {"name":"Анна","age":28}

    val decoded = Json.decodeFromString<User>(jsonString)
    println(decoded) // User(name=Анна, age=28)
}

Библиотека поддерживает полиморфизм, пользовательские сериализаторы и работу с JSON, XML, CBOR и даже YAML. Это must-have для любого Kotlin-проекта.

3. Koin — внедрение зависимостей без магии

Dagger? Hilt? Тяжело, много кода. Koin предлагает простой DSL для DI, написанный на чистом Kotlin. Никакой генерации кода, никаких аннотаций — только функции.

Пример: простой модуль и внедрение

import org.koin.core.context.startKoin
import org.koin.dsl.module
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

class Repository
class Service(private val repo: Repository) {
    fun doWork() = "Работаю с ${repo}"
}

val myModule = module {
    single { Repository() }
    factory { Service(get()) }
}

fun main() {
    startKoin { modules(myModule) }
    val service: Service = object : KoinComponent {}.inject()
    println(service.doWork())
}

Koin идеально подходит для средних и небольших проектов, где не хочется переплачивать за сложность.

4. Exposed — ORM для тех, кто не любит ORM

Большинство ORM скрывают SQL, но Exposed действует иначе: он остаётся близок к SQL, но даёт удобный DSL на Kotlin. Вы пишете на Kotlin, а получаете чистый SQL с автодополнением.

Пример: создание таблицы и запрос

import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction

object Users : Table() {
    val id = integer("id").autoIncrement()
    val name = varchar("name", 50)
    override val primaryKey = PrimaryKey(id)
}

fun main() {
    Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
    transaction {
        SchemaUtils.create(Users)
        Users.insert { it[name] = "Котлин" }
        val query = Users.selectAll().single()
        println("ID: ${query[Users.id]}, Name: ${query[Users.name]}")
    }
}

Exposed поддерживает транзакции, джойны, агрегатные функции и миграции через Flyway. Это одна из Kotlin библиотек, которую стоит освоить каждому backend-разработчику.

5. Kotlin Coroutines — асинхронность без коллбэков

Хотя корутины — это часть языка, библиотека kotlinx.coroutines предоставляет готовые инструменты для работы с потоками, каналами и Flow. Это фундамент, на котором строится вся асинхронная экосистема Kotlin.

Пример: параллельные запросы

import kotlinx.coroutines.*

suspend fun fetchData(id: Int): String {
    delay(1000) // имитация сетевого запроса
    return "Данные для ID=$id"
}

fun main() = runBlocking {
    val results = (1..5).map { id ->
        async { fetchData(id) }
    }
    println(results.awaitAll()) // [Данные для ID=1, ..., Данные для ID=5]
}

Без корутин сейчас невозможно представить ни один серьёзный проект на Kotlin. Они используются в Ktor, Exposed, Android и даже в Spring.

6. Arrow — функциональное программирование в массы

Хотите писать на Kotlin как на Haskell или Scala? Arrow привносит в язык функциональные конструкции: Option, Either, Validated, эффектные типы и монады. Это не просто библиотека, это целый фреймворк для функционального программирования.

Пример: обработка ошибок с Either

import arrow.core.*

fun divide(a: Int, b: Int): Either<String, Int> =
    if (b == 0) Either.Left("Деление на ноль")
    else Either.Right(a / b)

fun main() {
    val result = divide(10, 2)
    result.fold(
        { left -> println("Ошибка: $left") },
        { right -> println("Результат: $right") }
    )
}

Arrow — это выбор тех, кто ценит предсказуемость и композиционность кода.

7. MockK — моки для Kotlin, а не для Java

Mockito хорош, но он заточен под Java. MockK понимает Kotlin: он работает с корутинами, data классами, sealed классами и extension-функциями. И да, он поддерживает релаксированные моки и слоты.

Пример: мок с корутиной

import io.mockk.*

class Service {
    suspend fun call(): String = "real"
}

fun main() {
    val mock = mockk<Service>()
    coEvery {                

Блоги

Рекомендаций по книгам