0Pricing
Kotlin Academy · Lección

Patrones reified prácticos: análisis, DI y serialización

Aplique genéricos reified al análisis de JSON, la resolución de dependencias y los auxiliares de reflexión.

Patrones reified prácticos: análisis, DI y serialización es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.

Los tres casos de uso principales

Los parámetros de tipo reificados resultan especialmente útiles en tres patrones habituales de Kotlin: análisis de JSON y datos, inyección de dependencias y helpers de serialización. Cada uno elimina los argumentos ::class.java repetitivos.

Patrón 1 — Análisis de JSON con seguridad de tipos

Envuelva Gson o Jackson en una extensión reificada para que quienes la usen nunca tengan que pasar explícitamente un Class:

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

val user: User = jsonString.parseJson()

Análisis de colecciones

Analizar una lista genérica requiere un TypeToken. Con reified puede ocultar esta complejidad:

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()

Enfoque con kotlinx.serialization

kotlinx.serialization ya usa reified internamente. La función de nivel superior decodeFromString() se basa en serializer(), que es una función reified inline.

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

Patrón 2 — Service Locator / DI

Un service locator sencillo puede resolver dependencias por tipo sin que quienes lo usen tengan que pasar una 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
    }
}

Obtención de ViewModel en Android

El patrón reificado más habitual en Android:

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

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

Patrón 3 — Helper de conversión segura

Un helper de conversión reificado con un valor alternativo es más limpio que usar as? explícitamente en todas partes:

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

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

Comprobación de tipos en colecciones

El filterIsInstance() estándar es el filtro reificado canónico para colecciones. Puede crear variantes de mayor nivel a partir de él:

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

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

Registro de listeners de eventos por tipo

Un bus de eventos que distribuye por tipo resulta más práctico con 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)
}

Combinación de reified con funciones de extensión

Las funciones de extensión reificadas sobre receptores genéricos dan a las API un estilo fluido y mantienen la seguridad de tipos:

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}")
}

Límites que debe tener en cuenta

Recuerde: reified solo funciona en funciones inline. Las clases y las interfaces no pueden tener parámetros de tipo reificados. Si necesita información del tipo en tiempo de ejecución dentro de una clase, almacene una propiedad KClass.

Pruebas de helpers reificados

Las funciones reificadas son fáciles de probar: llámelas con argumentos de tipo concretos en las pruebas unitarias y compruebe el tipo y el valor de salida. No es necesario simular referencias de clase.

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

Comprobación rápida

¿Cuál de las siguientes afirmaciones sobre las funciones reificadas es correcta?

Resumen: patrones reificados prácticos

Patrones clave:

  • Análisis de JSON: ocultar los argumentos Class/TypeToken
  • DI/Service Locator: resolver por tipo sin parámetros KClass
  • Conversiones seguras y filtrado de colecciones
  • Distribución de eventos en el bus de eventos por tipo de evento
  • SharedPreferences / almacenes de pares clave-valor con tipos

Preguntas frecuentes

¿La lección «Patrones reified prácticos: análisis, DI y serialización» es gratis?

Sí — el texto completo de «Patrones reified prácticos: análisis, DI y serialización» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrones reified prácticos: análisis, DI y serialización»?

Aplique genéricos reified al análisis de JSON, la resolución de dependencias y los auxiliares de reflexión. Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Kotlin Academy?

No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Patrones reified prácticos: análisis, DI y serialización»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?

Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Funciones inline: eliminar la sobrecarga de las lambdas
  2. Modificadores noinline y crossinline
  3. Parámetros de tipo reified: acceder a T en tiempo de ejecución
  4. Patrones reified prácticos: análisis, DI y serialización
← Volver a Kotlin Academy