inline class (sinds Kotlin 1.5 — value class) maakt het mogelijk om wrappers rond primitieve types te creëren zonder dat er tijdens de uitvoering een apart object wordt aangemaakt. Dit wordt gebruikt voor het verhogen van de typeveiligheid zonder extra kosten voor geheugenallocatie. Onder de motorkap kunnen dergelijke objecten worden gecompileerd naar het overeenkomstige primitieve type.
Voorbeeld:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
Het gebruik van inline/value klassen is belangrijk voor de typisering van identificaties, geld, eenheden van metingen, enz.
Kan een value class meer dan één eigenschap hebben?
Antwoord: Nee. Een value class kan slechts één property in de primary constructor bevatten.
Voorbeeld van foutieve code:
@JvmInline value class Money(val amount: Int, val currency: String) // Compilatiefout
Verhaal
In een valutawisselkantoor werd een inline class toegepast om het bedrag en de valuta te beschrijven. Toen ze probeerden twee velden aan de value class toe te voegen, kregen ze een compilatiefout en besteedden enige tijd aan het omzeilen van de beperking. Uiteindelijk besloten ze een aparte data class te maken.
Verhaal
Bij integratie met een externe Java-bibliotheek werd de inline class soms onverwacht omgezet in een object (boxing), wat de prestaties beïnvloedde. Na het analyseren van de documentatie vervingen ze het door een gewone value object.
Verhaal
In een project met microservices gebruikten ze value classes als identificaties in de API. Een van de diensten gaf een string rechtstreeks terug, terwijl de andere een value class retourneerde, wat leidde tot een serialisatieconflict met Jackson. Dit werd opgelost door expliciete mapping tussen de id en de string.