Kotlin Academy · Lektion

Praktiska reified-mönster: parsning, DI och serialisering

Använd reified-generics för JSON-parsning, beroendeupplösning och reflection-hjälpare.

Lektion 4 av 414 steg

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
Gratis att börja

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

  1. inline-funktioner: eliminera lambda-overhead
  2. Modifierarna noinline och crossinline
  3. reified-typparametrar: få åtkomst till T under körning
  4. Praktiska reified-mönster: parsning, DI och serialisering
← Tillbaka till Kotlin Academy