ProgrammationDéveloppeur Backend

Qu'est-ce qu'une 'inline class' (value class) en Kotlin ? À quoi servent-elles, comment les utiliser correctement, quelles sont les limitations et particularités de ces classes ? Donnez des exemples de code.

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

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) }
  • Une seule propriété (champ principal) est autorisée.
  • Un constructeur sans argument n'est pas possible.
  • La classe ne peut pas contenir d'état (par exemple, des champs var), seulement des val.
  • Il n'est pas possible d'hériter d'autres classes, mais il est possible d'implémenter des interfaces.
  • L'interaction avec le code Java peut être contre-intuitive — des boxing/unboxing peuvent se produire.

L'utilisation des classes inline/value est importante pour typer les identifiants, l'argent, les unités de mesure, etc.

Question piège

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

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet


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.