Рубрика: Kotlin
-
Расскажи про контракт между Job-ами в иерархии
Контракт между Job-ами — ключевая фича корутин, которая спасает от утечек и делает код предсказуемым. И тем самым реализует Structured Concurrency. Основной контракт (золотое правило) Job-а родительской корутины ждёт завершения всех своих дочерних корутин и дочерняя корутина не может пережить родителя. Что происходит автоматически (контракт) Ситуация Что произойдёт автоматически Родитель завершился успешно Ждёт всех детей…
-
Основные билдеры корутин? Разница между launch и async
В Kotlin Coroutines есть три основных билдера для запуска корутин: Ключевая разница между launch() и async() launch() — это fire-and-forget, возвращает Job, ошибки сразу пробрасываются вверх. async() — это «будущий результат», возвращает Deferred, ошибки откладываются и выстреливают только в момент await(). Ошибки, которые часто делают: Ошибка Почему плохо? val data = async { … }…
-
Как работают suspend функции?
Suspend — это просто маркер на уровне компилятора Kotlin. Он как бы говорит: «Эта функция может приостанавливаться, но при этом оставаться в том же потоке». На уровне JVM-кода suspend-функция превращается в обычный метод с дополнительным параметром Continuation<T> и возвращает Any?. Что такое Continuation? Continuation<T> — это объект-колбэк, который как бы говорит: «Когда операция закончится —…
-
Что такое Coroutine Dispatchers? Какие виды есть?
Coroutine Dispatchers — это механизм, управляющий тем, на каком(-их) потоке(-ах) или в каком пуле будет выполняться корутина. Dispatcher — это часть контекста корутины (CoroutineContext), элемент CoroutineContext.Element, задающий CoroutineDispatcher. Если при запуске корутины не задан явный dispatcher, используется контекст родителя или Dispatchers.Default Основные виды встроенных Dispatcher‑ов:
-
Основные интерфейсы коллекций в Kotlin-е
В Kotlin (особенно в JVM-ориентированных проектах, таких как Android), основные коллекции строятся поверх Java Collection Framework, но Kotlin добавляет расширения, безопасный синтаксис и функциональный стиль. Основные интерфейсы коллекций в Kotlin Интерфейс Назначение Пример реализации Collection<T> Базовый интерфейс для всех коллекций List, Set, MutableList List<T> Упорядоченная коллекция с доступом по индексу listOf(1, 2, 3) Set<T> Уникальные…
-
Kotlin Contracts зачем нужны? Где использовать?
Contracts в Kotlin — это способ сообщить компилятору о свойствах функции, которые нельзя выразить типами. Обычно это: Зачем нужны Kotlin Contracts? Пример 1: Smart cast без контракта Компилятор не знает, что isString(x)==true, то есть x точно String. Пример 2: С контрактом
-
Какая польза от typealias? Во что он компилируется?
typealias в Kotlin это просто псевдоним для типа.Он не создаёт новый тип, а даёт другое имя уже существующему. Польза от typealias Польза Пример Повышение читаемости Username вместо String, Handler вместо (Int, String) -> Unit Переименование длинных типов Map<String, List<Pair<Int, String>>> → typealias UserMap = … Упрощение внедрения API Поддержка устаревшего/внешнего имени, не меняя реальный тип…
-
Extension в котлине, как работают? Можно ли сделать extension к интерфейсу?
Extension-функции — одна из фишек Kotlin, дающая синтаксический сахар. Это способ «добавить» новую функцию существующему типу без наследования или декоратора. Как работают extension-функции под капотом? Это обычные статические функции, которым компилятор даёт особый синтаксис. То есть: Можно ли делать extension к интерфейсу? Да, можно! Но важно: если объект реализует интерфейс, и ты вызываешь extension —…
-
Делегаты в Kotlin-е. Какие бывают, зачем нужны?
Делегаты в Kotlin — мощный инструмент, который позволяет переопределить поведение геттера/сеттера, вынести повторяющуюся логику, и писать более декларативный, читаемый код. Делегирование свойства — это когда мы передаём логику get() и set() специальному объекту.В Kotlin это делается с помощью ключевого слова by. Какие бывают делегаты в Kotlin? Делегат Назначение lazy { … } Вычисляется один раз…
-
init{} в Kotlin это аналог чего в Java?
init {} в Kotlin — это блок инициализации, и его аналог в Java — это инициализатор экземпляра (instance initializer block). Пример Kotlin: Аналог в Java: Обрати внимание: Как работает? Этап Kotlin (init {}) Java Когда выполняется при вызове primary constructor перед телом конструктора Может быть несколько? Да, выполняются в порядке объявления Да Можно использовать параметры…
-
Sealed class в Kotlin-е — что такое, зачем нужны? Можно ли наследовать один от другого? В чем отличие от Sealed interface?
Sealed class — это класс, у которого жестко ограничен список подклассов. Все наследники должны быть объявлены в том же файле, что и сам sealed class. Зачем нужны? Можно ли наследовать один sealed от другого? Один sealed class может наследовать другую, но: Sealed interface — что это такое? Добавлено в Kotlin 1.5+ Похож на sealed class,…
-
Что такое Nothing в Kotlin-е, зачем нужен?
Nothing — это специальный bottom type в Kotlin. То есть: тип, у которого нет ни одного значения. Ни один объект не может быть экземпляром Nothing. Nothing — это тип, который представляет код, который никогда не завершится успешно (т.е. никогда не вернёт управление). Позволяет выразить невозможность возврата