Kotlin a introduit le concept de classes inline/value (maintenant appelées value class) pour minimiser le surcoût d'exécution lors de l'utilisation d'enveloppes autour des primitifs et de petites structures. L'idée est empruntée à d'autres langages (comme les structs en C#), où une telle optimisation est utile pour améliorer les performances sans perdre la typage.
Créer des classes enveloppes (par exemple, pour les types d'entités ou les identifiants) sans optimisation entraîne la création d'un objet supplémentaire en mémoire, ce qui impacte les performances, le GC et peut entraîner un surcoût de Boxing/Unboxing. Il y a souvent un désir d'avoir une typage stricte (comme UserId au lieu de Int), mais sans création réelle d'objets.
La value class est déclarée avec le modificateur value. Dans la plupart des situations, la JVM ne crée pas d'objet supplémentaire — la value class est remplacée directement par son champ (inlining). Cela offre une sécurité de type et des performances proches de « juste Int ».
Exemple de code :
@JvmInline value class UserId(val value: Int) fun showId(id: UserId) = println(id.value) val id = UserId(15) showId(id) // Sans créer un objet séparé UserId
Caractéristiques clés :
Les value class peuvent-elles avoir plusieurs propriétés ?
Non, la value class ne peut contenir qu'une seule propriété.
// Erreur : // value class Money(val amount: Int, val currency: String)
Peut-on créer une value class avec une propriété nullable ?
Le champ value d'une value class ne peut pas être nullable — uniquement des types non-nullables.
// Erreur : // value class Name(val value: String?)
Peut-on utiliser l'héritage avec les value class ?
Les value class ne supportent pas l'héritage et ne peuvent pas être abstraites ou sealed.
// Erreur : // value class NewId(val value: Int): BaseId()
Un développeur a créé une value class pour une entité avec deux propriétés (par exemple, une paire Int et String), ce qui a entraîné une erreur de compilation.
Avantages :
Un développeur utilise une value class pour un type d'identifiant avec un seul champ (par exemple, UserId), ce qui fonctionne rapidement et en toute sécurité.
Avantages :