ProgrammatieBackend ontwikkelaar

Wat is een 'inline class' (value class) in Kotlin? Waar zijn ze voor nodig, hoe gebruik je ze correct, wat zijn de beperkingen en bijzonderheden van dergelijke klassen? Geef voorbeelden van code.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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) }
  • Slechts één eigenschap (hoofdveld) is toegestaan.
  • Een constructor zonder argumenten is niet mogelijk.
  • De klas kan geen status bevatten (bijvoorbeeld var-velden), alleen val.
  • Het kan geen andere klassen erven, maar het kan interfaces implementeren.
  • Interactie met Java-code kan onduidelijk zijn — er kan boxing/unboxing plaatsvinden.

Het gebruik van inline/value klassen is belangrijk voor de typisering van identificaties, geld, eenheden van metingen, enz.

Vragen met een valstrik

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

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp


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.