L'inline class (a partire da Kotlin 1.5 — value class) consente di creare wrapper attorno ai primitivi senza creare un oggetto separato durante l'esecuzione. Questo è utilizzato per aumentare la type-safety senza costi di allocazione della memoria. Sotto il cofano, questi oggetti possono essere compilati nel corrispondente primitivo.
Esempio:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
L'uso di classi inline/value è importante per la tipizzazione di identificatori, denaro, unità di misura, ecc.
Può una value class avere più di una proprietà?
Risposta: No. La value class può contenere solo una proprietà nel costruttore principale.
Esempio di codice errato:
@JvmInline value class Money(val amount: Int, val currency: String) // Errore di compilazione
Storia
In una兑换货币 utilizzavano la classe inline per descrivere importi e valuta. Hanno provato ad aggiungere due campi alla value class, ricevuto un errore di compilazione e speso del tempo a cercare di aggirare la limitazione. Alla fine hanno deciso di fare una data class separata.
Storia
Durante l'integrazione con una libreria Java esterna, la classe inline veniva a volte convertita in oggetto (boxing) in modo imprevisto, influenzando le prestazioni. Dopo aver analizzato la documentazione, l'hanno sostituita con un normale value object.
Storia
In un progetto con microservizi utilizzavano classi value come identificativi nell'API. Uno dei servizi restituiva una stringa direttamente, l'altro — una value class, il che portava a un conflitto di serializzazione con Jackson. Hanno risolto tramite mappatura esplicita tra ID e stringa.