0Pricing
Kotlin Academy · Урок

Практические шаблоны reified: разбор, DI и сериализация

Применяйте обобщения reified для разбора JSON, разрешения зависимостей и помощников рефлексии.

«Практические шаблоны reified: разбор, DI и сериализация» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Три основных сценария использования

Рефицированные параметры типов особенно полезны в трёх распространённых шаблонах Kotlin: разборе JSON и данных, внедрении зависимостей и вспомогательных функциях сериализации. Каждый из них устраняет шаблонные аргументы ::class.java.

Шаблон 1 — типобезопасный разбор JSON

Оберните Gson или Jackson в рефицированное расширение, чтобы вызывающему коду больше не приходилось явно передавать Class:

inline fun <reified T> String.parseJson(): T =
    Gson().fromJson(this, T::class.java)

val user: User = jsonString.parseJson()

Разбор коллекций

Для разбора обобщённого списка требуется TypeToken. С помощью reified эту сложность можно скрыть:

inline fun <reified T> String.parseList(): List<T> {
    val type = object : TypeToken<List<T>>() {}.type
    return Gson().fromJson(this, type)
}

val users: List<User> = jsonString.parseList()

Подход kotlinx.serialization

kotlinx.serialization уже использует reified внутри. Функция верхнего уровня decodeFromString() опирается на serializer(), которая является функцией reified inline.

val user = Json.decodeFromString<User>(jsonString)
// equivalent to: Json.decodeFromString(serializer<User>(), jsonString)

Шаблон 2 — локатор служб / DI

Простой локатор служб может разрешать зависимости по типу, не требуя от вызывающего кода передавать KClass:

object ServiceLocator {
    val registry = mutableMapOf<KClass<*>, Any>()
    inline fun <reified T : Any> get(): T =
        registry[T::class] as? T ?: error("No binding for ${T::class}")
    inline fun <reified T : Any> bind(instance: T) {
        registry[T::class] = instance
    }
}

Получение ViewModel в Android

Самый распространённый шаблон с рефицированными типами в Android:

inline fun <reified VM : ViewModel> ComponentActivity.viewModel(): VM =
    ViewModelProvider(this)[VM::class.java]

// Usage
val vm: MyViewModel by lazy { viewModel() }

Шаблон 3 — вспомогательная функция безопасного приведения типов

Вспомогательная функция рефицированного приведения с резервным вариантом удобнее, чем явное использование as? повсюду:

inline fun <reified T> Any?.safeCast(): T? = this as? T

val name: String? = someAny.safeCast<String>()

Проверка типов в коллекциях

Стандартная функция filterIsInstance() — классический фильтр коллекции с рефицированным типом. На её основе можно создавать варианты более высокого уровня:

inline fun <reified T> List<Any>.onlyInstancesOf(block: (T) -> Unit) =
    filterIsInstance<T>().forEach(block)

items.onlyInstancesOf<Button> { it.setEnabled(true) }

Регистрация обработчиков событий по типу

Шина событий, выполняющая диспетчеризацию по типу, становится удобнее с reified:

class EventBus {
    val handlers = mutableMapOf<KClass<*>, (Any) -> Unit>()
    inline fun <reified E : Any> on(noinline handler: (E) -> Unit) {
        handlers[E::class] = { handler(it as E) }
    }
    fun post(event: Any) = handlers[event::class]?.invoke(event)
}

Сочетание рефицированных типов с функциями-расширениями

Функции-расширения с рефицированными типами для обобщённых получателей придают API плавный и удобный стиль, сохраняя типобезопасность:

inline fun <reified T : Any> SharedPreferences.get(key: String, default: T): T = when (T::class) {
    Int::class    -> getInt(key, default as Int) as T
    String::class -> getString(key, default as String) as T
    Boolean::class -> getBoolean(key, default as Boolean) as T
    else -> error("Unsupported type ${T::class}")
}

Ограничения, о которых следует помнить

Помните: reified работает только во inline-функциях. Классы и интерфейсы не могут иметь рефицированные параметры типов. Если классу нужна информация о типе во время выполнения, храните вместо этого свойство KClass.

Тестирование вспомогательных функций с рефицированными типами

Реقфицированные функции легко тестировать: вызывайте их с конкретными аргументами типов в модульных тестах и проверяйте тип и значение результата. Подменять ссылки на классы не требуется.

val result: List<String> = """["a","b","c"]""".parseList<String>()
assertEquals(listOf("a","b","c"), result)

Быстрая проверка

Какое утверждение о функциях с рефицированными типами верно?

Итоги: практические шаблоны с рефицированными типами

Основные шаблоны:

  • Разбор JSON: скрытие аргументов Class/TypeToken
  • DI/локатор служб: разрешение по типу без параметров KClass
  • Безопасное приведение типов и фильтрация коллекций
  • Диспетчеризация шиной событий по типу события
  • SharedPreferences и типизированные хранилища пар «ключ—значение»

Часто задаваемые вопросы

Урок «Практические шаблоны reified: разбор, DI и сериализация» бесплатный?

Да — полный текст урока «Практические шаблоны reified: разбор, DI и сериализация» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Практические шаблоны reified: разбор, DI и сериализация»?

Применяйте обобщения reified для разбора JSON, разрешения зависимостей и помощников рефлексии. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Практические шаблоны reified: разбор, DI и сериализация»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. inline-функции: устранение накладных расходов лямбд
  2. Модификаторы noinline и crossinline
  3. Параметры типов reified: доступ к T во время выполнения
  4. Практические шаблоны reified: разбор, DI и сериализация
← Назад к Kotlin Academy