inline class (depuis Kotlin 1.5 — value class) permet de créer des wrappers autour des types primitifs sans créer un objet distinct au moment de l'exécution. Cela est utilisé pour augmenter la sécurité de type sans les coûts d'allocation de mémoire. En interne, ces objets peuvent être compilés en type primitif correspondant.
Exemple :
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
L'utilisation des classes inline/value est importante pour typer les identifiants, l'argent, les unités de mesure, etc.
Une value class peut-elle avoir plus d'une propriété ?
Réponse : Non. Une value class ne peut contenir qu'une seule propriété dans le constructeur principal.
Exemple de code erroné :
@JvmInline value class Money(val amount: Int, val currency: String) // Erreur de compilation
Histoire
Dans un bureau de change, nous avons utilisé une inline class pour décrire le montant et la devise. Nous avons essayé d'ajouter deux champs à la value class, et avons obtenu une erreur de compilation. Nous avons perdu du temps à essayer de contourner cette limite. Au final, nous avons décidé de créer une data class distincte.
Histoire
Lors de l'intégration avec une bibliothèque Java externe, la inline class était parfois convertie en objet (boxing) de manière inattendue, ce qui a affecté les performances. Après avoir analysé la documentation, nous l'avons remplacée par un simple value object.
Histoire
Dans un projet de microservices, nous avons utilisé une value class comme identifiants dans l'API. Un des services renvoyait une chaîne directement, l'autre — une value class, ce qui a conduit à un conflit de sérialisation avec Jackson. Nous avons corrigé cela par un mappage explicite entre l'id et la chaîne.