Kotlin Academy · Aula

Padrões práticos com reified: análise, DI e serialização

Aplique genéricos reified à análise de JSON, à resolução de dependências e a auxiliares de reflexão.

Aula 4 de 414 etapas

Padrões práticos com reified: análise, DI e serialização é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

Os três principais casos de uso

Parâmetros de tipo reificados são especialmente úteis em três padrões recorrentes do Kotlin: análise de JSON/dados, injeção de dependências e auxiliares de serialização. Cada um elimina argumentos ::class.java repetitivos.

Padrão 1 — análise JSON segura quanto aos tipos

Envolva Gson ou Jackson em uma extensão reificada para que quem faz a chamada nunca precise passar uma Class explicitamente:

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

val user: User = jsonString.parseJson()

Analisando coleções

Analisar uma lista genérica exige um TypeToken. Com reified, você pode ocultar essa complexidade:

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

Abordagem com kotlinx.serialization

kotlinx.serialization já usa reified internamente. A função de nível superior decodeFromString() depende de serializer(), que é uma função reified inline.

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

Padrão 2 — localizador de serviços / DI

Um localizador de serviços simples pode resolver dependências pelo tipo, sem exigir que quem faz a chamada passe uma 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
    }
}

Recuperação de ViewModel no Android

O padrão reificado mais comum no Android:

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

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

Padrão 3 — auxiliar de conversão segura

Um auxiliar de conversão reificado com uma alternativa é mais limpo do que usar as? explicitamente em todos os lugares:

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

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

Verificando tipos em coleções

O filterIsInstance() padrão é o filtro reificado canônico para coleções. Você pode criar variantes de nível mais alto com base nele:

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

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

Registrando ouvintes de eventos por tipo

Um barramento de eventos que distribui eventos por tipo se torna mais prático com 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)
}

Combinando reified com funções de extensão

Funções de extensão reificadas em receptores genéricos dão às APIs uma aparência fluida, mantendo a segurança 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}")
}

Limitações a considerar

Lembre-se: reified funciona apenas em funções inline. Classes e interfaces não podem ter parâmetros de tipo reificados. Se você precisar de informações de tipo em tempo de execução em uma classe, armazene uma propriedade KClass.

Testando auxiliares reificados

Funções reificadas são simples de testar — chame-as com argumentos de tipo concretos em testes unitários e verifique o tipo e o valor da saída. Não é necessário simular referências de classes.

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

Verificação rápida

Qual afirmação sobre funções reificadas está correta?

Recapitulação: padrões reificados práticos

Principais padrões:

  • Análise de JSON: oculte argumentos de classe/TypeToken
  • DI/Localizador de serviços: resolva pelo tipo sem parâmetros KClass
  • Conversão segura e filtragem de coleções
  • Distribuição pelo tipo de evento em um barramento de eventos
  • SharedPreferences / armazenamentos de chave-valor tipados
Grátis para começar

Aprenda Kotlin com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Padrões práticos com reified: análise, DI e serialização” é grátis?

Sim — o texto completo de “Padrões práticos com reified: análise, DI e serialização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “Padrões práticos com reified: análise, DI e serialização”?

Aplique genéricos reified à análise de JSON, à resolução de dependências e a auxiliares de reflexão. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Padrões práticos com reified: análise, DI e serialização”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções inline: eliminando a sobrecarga de lambdas
  2. Modificadores noinline e crossinline
  3. Parâmetros de tipo reified: acessando T em tempo de execução
  4. Padrões práticos com reified: análise, DI e serialização
← Voltar para Kotlin Academy