Praktiska reified-mönster: parsning, DI och serialisering
Använd reified-generics för JSON-parsning, beroendeupplösning och reflection-hjälpare.
Praktiska reified-mönster: parsning, DI och serialisering är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.
De tre huvudsakliga användningsfallen
Reified-typparametrar är särskilt användbara i tre återkommande Kotlin-mönster: JSON-/dataparsning, beroendeinjektion och serialiseringshjälpfunktioner. De eliminerar behovet av överflödiga ::class.java-argument.
Mönster 1 — typsäker JSON-parsning
Omslut Gson eller Jackson i en reified extension-funktion så att anroparen aldrig behöver skicka en Class explicit:
inline fun <reified T> String.parseJson(): T =
Gson().fromJson(this, T::class.java)
val user: User = jsonString.parseJson()Parsa samlingar
Att parsa en generisk lista kräver en TypeToken. Med reified kan du dölja denna komplexitet:
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()Tillvägagångssätt med kotlinx.serialization
kotlinx.serialization använder redan reified internt. Den toppnivådefinierade decodeFromString bygger på serializer, som är en reified inline-funktion.
val user = Json.decodeFromString<User>(jsonString)
// equivalent to: Json.decodeFromString(serializer<User>(), jsonString)Mönster 2 — Service Locator / DI
En enkel service locator kan slå upp beroenden efter typ utan att anroparen skickar en 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
}
}Hämta ViewModel i Android
Det vanligaste Android-mönstret med reified:
inline fun <reified VM : ViewModel> ComponentActivity.viewModel(): VM =
ViewModelProvider(this)[VM::class.java]
// Usage
val vm: MyViewModel by lazy { viewModel() }Mönster 3 — hjälp för säker typkonvertering
En reified-hjälpfunktion för typkonvertering med ett reservvärde är renare än att skriva as? explicit överallt:
inline fun <reified T> Any?.safeCast(): T? = this as? T
val name: String? = someAny.safeCast<String>()Typkontroll av samlingar
Standardfunktionen filterIsInstance är det klassiska reified-filtret för samlingar. Du kan bygga varianter på högre nivå ovanpå den:
inline fun <reified T> List<Any>.onlyInstancesOf(block: (T) -> Unit) =
filterIsInstance<T>().forEach(block)
items.onlyInstancesOf<Button> { it.setEnabled(true) }Registrera händelselyssnare efter typ
En eventbuss som distribuerar händelser efter typ blir smidig med 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)
}Kombinera reified med extension-funktioner
Reified-extensionfunktioner på generiska receivers ger API:er en fluent känsla samtidigt som typsäkerheten bevaras:
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}")
}Begränsningar att tänka på
Kom ihåg: reified fungerar endast i inline-funktioner. Klasser och gränssnitt kan inte ha reified-typparametrar. Om du behöver typinformation vid körning i en klass, lagra i stället en KClass-egenskap.
Testa reified-hjälpfunktioner
Reified-funktioner är enkla att testa – anropa dem med konkreta typargument i enhetstester och kontrollera resultatets typ och värde. Ingen mockning av klassreferenser behövs.
val result: List<String> = """["a","b","c"]""".parseList<String>()
assertEquals(listOf("a","b","c"), result)Snabbkontroll
Vilket påstående om reified-funktioner är korrekt?
Sammanfattning: praktiska reified-mönster
Viktiga mönster:
- JSON-parsning: dölj Class-/TypeToken-argument
- DI/Service Locator: slå upp efter typ utan KClass-parametrar
- Säker typkonvertering och filtrering av samlingar
- Distribuera händelser i en eventbuss efter händelsetyp
- SharedPreferences / typade nyckelvärdeslager
Lär dig Kotlin med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Praktiska reified-mönster: parsning, DI och serialisering” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”Praktiska reified-mönster: parsning, DI och serialisering”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Praktiska reified-mönster: parsning, DI och serialisering”?
Använd reified-generics för JSON-parsning, beroendeupplösning och reflection-hjälpare. Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?
Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Praktiska reified-mönster: parsning, DI och serialisering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?
Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- inline-funktioner: eliminera lambda-overhead
- Modifierarna noinline och crossinline
- reified-typparametrar: få åtkomst till T under körning
- Praktiska reified-mönster: parsning, DI och serialisering